【问题标题】:Character Animation with Metal金属角色动画
【发布时间】:2015-01-03 19:15:28
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • FIY:Scene Kit确实支持骨骼动画、自定义着色器和多通道渲染。 确实它们没有Metal那么强大。

标签: ios swift metal


【解决方案1】:

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

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

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

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

【讨论】:

  • 嘿!谢谢(你的)信息!直截了当地说,如果我要使用 Metal,那么我是否必须从头开始编写骨骼动画才能使角色动画?再次感谢您的帮助!
  • 是的,您必须编写自己的基于 Metal 的骨骼动画代码。 (除非您使用第三方、基于 Metal 的高级游戏引擎,例如 Unreal 或 Unity,否则该引擎有自己对骨骼动画的支持。)
  • @rickster 是否可以使用 Metal Shader 为 SceneKit 中的骨骼角色设置动画?
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

    通常,您需要使用(例如)Autodesk Maya 创建蒙皮模型,并将其与使用骨架的动画一起保存在场景文件中。您可以从场景文件中加载模型并在您的应用程序中设置姿势或为其设置动画,方法是使用同样从场景文件中加载的动画对象或直接操作骨架中的节点。就是这样。

    观看这个由 7 部分组成的视频about Blender's skeletal system and how to use it in 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
                     )
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2018-09-11
      • 2012-01-15
      相关资源
      最近更新 更多