4

我刚刚深入研究了金属世界,我以为我已经掌握了窍门!但后来我突然想到,如果我想制作一款游戏,那么在屏幕上移动的静态对象是不够的。所以我的问题是,'是否可以使用 Metal 为模型创建动画?

我曾研究过使用其他 API,例如 SpriteKit 和 SceneKit,但我发现它们不支持着色器,并且不如 Metal 强大。

我能想到的唯一方法是创建 60 个不同的模型,然后一个接一个地加载每个模型,以产生“定格”效果,但我认为这会可能效率极低,并希望有一个更简单的答案?

非常感谢!

4

3 回答 3

5

是的,还有其他更有效的动画制作方法。但在进入之前,警告:看起来你真的在这里吠错了树。

Metal 是一个(概念上)非常低级的接口。您使用 Metal (几乎)直接与 GPU 对话,因此要使用它,您需要(有点)像 GPU 一样思考:在数据缓冲区、顶点变换等方面。您似乎工作在更高的水平概念级别,因此您可能更适合使用高级游戏引擎之一:SpriteKit for 2D 或 SceneKit for 3D。(或第三方引擎,如 Cocos 或 Unity。)另一方面,Metal 更适合构建这些游戏引擎。

SpriteKit 和 SceneKit确实支持着色器。查看文档(SKShaderSCNShadable确保单击“更多”链接以阅读完整概述)。SceneKit 还支持角色动画(又名骨骼动画,又名蒙皮):通常在外部创作工具(Maya、Blender 等)中设计和装配动画模型,然后使用 SceneKit 在运行时处理动画。

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

于 2015-01-03T21:01:31.883 回答
1

您可以在 Metal 中制作骨骼动画,SCNKit 也会使用 GPU 来变形网格。但是要在 Metal 中执行此操作,您需要传递皮肤权重,以及用于绑定姿势的骨骼矩阵和骨骼在动画时的变换,然后根据这些计算新的顶点位置。事实上,我认为你需要绑定姿势矩阵的逆矩阵。然后每个网格顶点通过由蒙皮权重决定的变换的加权和进行变换。

我试过了,但搞砸了,它没有正确变形,我不知道我是否从我的自定义脚本中获取了错误的矩阵来从搅拌器中获取动画数据,或者我的着色器数学或权重中的错误。

它可能很接近,但是由于我在这个过程中可能出错的所有可能的事情,很难修复,所以我最终放弃了它。

可能更容易坚持使用 SceneKit,让苹果负责其余的工作或使用现有的游戏引擎,例如 Unity。

再说一次,如果你想挑战,我相信这是可能的,只是有点棘手。您可以先尝试 CPU 以确保数学正常,然后将其移植到 GPU 以使其更快?

于 2017-09-27T23:50:06.830 回答
1

SceneKit 确实支持着色器。一个管理骨骼动画与它们动画的节点和几何图形之间关系的对象SCNSkinner来自 SceneKit。

通常,您需要使用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
                 )
于 2017-12-30T11:33:48.520 回答