我已经尝试使用其他API,例如SpriteKit和SceneKit,但我发现它们不支持着色器,并且不如Metal强大。
我唯一能想到的方法是创建60个不同的模型,然后依次加载每个模型,以产生“定格动画”效果,但我认为这可能效率极低,希望有更简单的答案?
非常感谢!
是的,有其他更有效的动画实现方式。但在此之前,需要提醒一下:看起来你可能走错了方向。
Metal是一个(概念上)非常低级的接口。你使用Metal(几乎)直接与GPU通信,因此需要像GPU一样思考,例如数据缓冲区、顶点变换等。你似乎在更高层次的概念上工作,所以最好使用其中一个高级游戏引擎:2D的SpriteKit或3D的SceneKit。(或第三方引擎,如Cocos或Unity。)另一方面,Metal更适合用于构建这些游戏引擎。
SpriteKit和SceneKit都支持着色器。请查看文档中的SKShader
和SCNShadable
(一定要点击“More”链接以阅读完整概述)。SceneKit还支持角色动画(又称骨骼动画或皮肤绑定):通常情况下,人们会在外部制作工具(Maya、Blender等)中设计和装配模型以供动画使用,然后使用SceneKit在运行时处理动画。
在Metal中可以做像GPU骨骼动画这样的事情。但我还没有看到任何关于它的教程或类似的文章,可能是因为Metal是一项新技术。不过,从根本上讲,它将基于您在OpenGL或Direct3D中用于骨骼动画的相同技术,而且已经有很多关于这些技术的动画文章。如果您愿意投入时间和精力来进行低级别的工作,那么从GL/D3D教程中调整主题相对容易。
SceneKit
中对骨骼角色进行动画,这是否可能? - Coldsteel48SceneKit支持着色器。管理骨骼动画和节点以及它们所动画的几何体之间关系的对象是来自SceneKit的SCNSkinner
。
通常,您需要使用例如Autodesk Maya创建带骨骼的模型,并将其与使用该骨架的动画一起保存在场景文件中。您从场景文件中加载模型并在应用程序中进行姿势或动画处理,可以使用从场景文件中加载的动画对象,也可以直接操作骨架中的节点。就是这样。
观看这个由7部分组成的视频关于Blender的骨骼系统以及如何在SceneKit中使用它。
convenience init(baseGeometry: SCNGeometry?, //character
bones: [SCNNode], //array of bones
boneInverseBindTransforms: [NSValue]?, //ibt of matrix4
boneWeights: SCNGeometrySource, //influence on geometry
boneIndices: SCNGeometrySource //index mapping
)