1

我正在尝试在 Android 的 OpenGL ES2 中实现骨骼动画,我有一个使用 io_three 从 Blender 导出的 JSON 模型,我可以从这个文件中读取 Bones 数组,每个数组的位置为 3 个浮点数组,四元数旋转为 4 个浮点数组并缩放和一个整数,它是父级,我也有动画,它有层次列表,据我所知,它每帧处理每个骨骼矩阵,每个层次都有一个父级和键列表,每个键都具有与骨骼相同的组件,所以我阅读了很多教程并制作了多次尝试但不幸的是我没有成功,我需要简单解释一下逻辑。所以我有一个骨骼类,每个类都有向量,我可以得到每个骨骼的相对矩阵,然后将它与父绝对矩阵相乘,得到骨骼的绝对矩阵,然后对其求逆得到逆矩阵,我可以对每个键进行相同的计算,但我不能将它们绑定在一起,我需要了解骨骼和每一帧之间的关系。我的问题不在于代码,而在于逻辑。

4

1 回答 1

3

我将尝试解释如何在整个动画的开始时间和结束时间之间的某些t动画中计算动画骨架。t

我可以从这个文件中读取 Bones 数组,每个数组的位置为 3 个浮点数数组,四元数旋转为 4 个浮点数数组和缩放

您还必须具有上述时间数据,即如果您的动画中有 17 帧,则为每帧的时间信息。假设您有此数据或可以从中获取此数据io_three,您可以计算动画矩阵。更细化的步骤是:

  1. 查找时间的位置数据,t即您找到带有时间的 2 帧,t1这样t2t1 < t < t2。现在您可以计算插值平移矩阵。
  2. 与 1 类似,计算插值的旋转和缩放矩阵。
  3. 现在从刚刚计算的 T、R、S 矩阵中找到局部动画矩阵:A。
  4. 接下来将局部动画矩阵与您的骨骼反向绑定变换相乘。
  5. 现在与父矩阵相乘,得到一个累积动画矩阵。

您可以在此处查看此类计算的示例:注意它在 ObjectiveC 中,使用Assimp

您将对骨骼中的每个骨骼执行步骤 1 到 4,并从骨骼的根部一直向下遍历,这样可以确保对于每个骨骼,您都有一个累积的动画矩阵。您从IdentityMatrix作为父矩阵开始。

因为你必须从骨架的根开始,你也必须知道那个根。您的数据要么提供骨架的根,要么您必须派生骨架根。如果你有一棵骨骼节点树,那么深度最低的节点就是根节点!

获得每个骨骼的动画矩阵后,您还需要知道影响每个顶点的骨骼数量以及该影响的权重。然后您可以在 CPU 或 GPU 上计算变形的顶点。请注意,两者各有利弊

这篇文章的最佳答案中描述了对骨骼动画的更好解释,但使用了 Assimp 库。

总的来说,虽然骨骼动画的整体逻辑很简单;困难的部分是导航包含所有数据的数据结构并构建正确的动画矩阵,识别骨架的根节点以及从顶点到骨骼/动画数据的映射。

于 2016-12-26T07:01:23.747 回答