使用Metal进行角色动画

6
我刚刚涉足Metal世界,认为我已经掌握了它!但是我想如果我想制作一个游戏,那么在屏幕上移动的静态对象是不够的。所以我的问题是,“是否可以使用Metal为模型创建动画?”
我已经尝试使用其他API,例如SpriteKit和SceneKit,但我发现它们不支持着色器,并且不如Metal强大。
我唯一能想到的方法是创建60个不同的模型,然后依次加载每个模型,以产生“定格动画”效果,但我认为这可能效率极低,希望有更简单的答案?
非常感谢!

1
FYI:Scene Kit确实支持骨骼动画、自定义着色器和多通道渲染。然而,不可否认的是它们并不像Metal那样强大。 - David Rönnqvist
3个回答

6

是的,有其他更有效的动画实现方式。但在此之前,需要提醒一下:看起来你可能走错了方向。

Metal是一个(概念上)非常低级的接口。你使用Metal(几乎)直接与GPU通信,因此需要像GPU一样思考,例如数据缓冲区、顶点变换等。你似乎在更高层次的概念上工作,所以最好使用其中一个高级游戏引擎:2D的SpriteKit或3D的SceneKit。(或第三方引擎,如Cocos或Unity。)另一方面,Metal更适合用于构建这些游戏引擎。

SpriteKit和SceneKit都支持着色器。请查看文档中的SKShaderSCNShadable(一定要点击“More”链接以阅读完整概述)。SceneKit还支持角色动画(又称骨骼动画或皮肤绑定):通常情况下,人们会在外部制作工具(Maya、Blender等)中设计和装配模型以供动画使用,然后使用SceneKit在运行时处理动画。

在Metal中可以做像GPU骨骼动画这样的事情。但我还没有看到任何关于它的教程或类似的文章,可能是因为Metal是一项新技术。不过,从根本上讲,它将基于您在OpenGL或Direct3D中用于骨骼动画的相同技术,而且已经有很多关于这些技术的动画文章。如果您愿意投入时间和精力来进行低级别的工作,那么从GL/D3D教程中调整主题相对容易。


嗨!谢谢提供的信息!只是为了搞清楚事情,如果我要使用Metal,那么我就必须从头开始编写骨骼动画程序才能使角色动起来了吗?再次感谢您的帮助! - Oli Callaghan
是的,你需要自己编写基于Metal的骨骼动画代码。(除非你使用的是第三方基于Metal的更高级游戏引擎,例如Unreal或Unity,并且该引擎本身支持骨骼动画。) - rickster
@rickster 通过使用Metal Shader在SceneKit中对骨骼角色进行动画,这是否可能? - Coldsteel48

1
您可以在Metal中进行骨骼动画,SCNKit也会使用GPU来变形网格。但是要在Metal中实现这一点,您需要传递皮肤权重以及绑定姿势的骨骼矩阵和它们随着动画而变换的骨骼矩阵,然后根据这些计算新的顶点位置。事实上,我认为您需要绑定姿势矩阵的逆矩阵。然后,每个网格顶点都会通过由皮肤权重决定的一系列变换的加权总和进行变换。
我尝试过,但某种方式搞砸了,没有正确变形,我不知道是否从我的自定义脚本中获取了错误的矩阵来获取来自blender的动画数据,或者是我的着色器数学或权重中的漏洞。
可能接近了,但由于我在过程中可能出错的所有可能性,很难修复,所以最终放弃了。
可能更容易坚持使用SceneKit并让Apple来处理其余部分,或者使用现有的游戏引擎,如Unity。
再说,如果您想挑战一下,我相信这是可能的,只是有点棘手。您可以先尝试使用CPU确保数学公式正确,然后将其移植到GPU以使其更快?

1

SceneKit支持着色器。管理骨骼动画和节点以及它们所动画的几何体之间关系的对象是来自SceneKit的SCNSkinner

通常,您需要使用例如Autodesk Maya创建带骨骼的模型,并将其与使用该骨架的动画一起保存在场景文件中。您从场景文件中加载模型并在应用程序中进行姿势或动画处理,可以使用从场景文件中加载的动画对象,也可以直接操作骨架中的节点。就是这样。

观看这个由7部分组成的视频关于Blender的骨骼系统以及如何在SceneKit中使用它

enter image description here

convenience init(baseGeometry: SCNGeometry?,              //character
                 bones: [SCNNode],                        //array of bones
                 boneInverseBindTransforms: [NSValue]?,   //ibt of matrix4
                 boneWeights: SCNGeometrySource,          //influence on geometry
                 boneIndices: SCNGeometrySource           //index mapping
                 )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接