OpenGL骨骼动画逻辑
OpenGL skeletal animation logic
我正在尝试在 Android 的 OpenGL ES2 中实现骨骼动画,我有一个使用 io_three 从 Blender 导出的 JSON 模型,我可以从这个文件中读取每个骨骼数组一个有位置作为 3 个浮点数数组,四元数旋转为 4 个浮点数数组和比例以及一个作为父级的整数,我还有一个动画,据我所知,它具有层次结构列表,它每帧处理每个骨骼矩阵,每个层次结构都有一个父级和列表keys 每个键都有与骨骼相同的组件,所以我阅读了很多教程并做了很多尝试但不幸的是我没有成功,我需要简单的逻辑解释。
所以我有一个骨骼 class 每个骨骼都有向量,我可以获得每个骨骼的相对矩阵,然后将它与父级绝对矩阵相乘以获得骨骼的绝对矩阵,然后将其求逆以获得逆矩阵,
我可以对每个键进行相同的计算,但我不能将它们绑定在一起,我需要了解骨骼和每个帧之间的关系。
我的问题不在于代码,而在于逻辑。
我将尝试解释如何在动画的某些 t
处计算动画骨架,其中 t
介于整个动画的开始和结束时间之间。
I can read from this file Bones array each one has Position as 3 floats array, quaternion rotation as 4 floats array and scale
您还必须拥有上述的时间数据,即如果您的动画中有 17 帧,则每帧的时间信息。假设你有这个或者可以从 io_three
获得这个数据,你可以计算动画矩阵。更细化的步骤是:
- 查找时间
t
的位置数据,即您找到时间为 t1
和 t2
的 2 帧,使得:t1 < t < t2
。现在您可以计算内插平移矩阵了。
- 与 1 类似,计算内插旋转和缩放矩阵。
- 现在从您刚刚计算的 T、R、S 矩阵中找到局部动画矩阵:A。
- 接下来将局部动画矩阵与骨骼反向绑定变换相乘。
- 现在与父矩阵相乘,得到一个累积动画矩阵。
你可以看到这种computation here: note that it is in ObjectiveC, using Assimp的样本。
您将为骨架中的每个骨骼执行步骤 1 到 4,并从骨架的根部一直向下遍历,这确保每个骨骼都有一个累积动画矩阵。您从 IdentityMatrix
作为父矩阵开始。
因为你必须从骨架的根开始,所以你也必须知道那个根。您的数据要么提供骨架的根,要么必须派生骨架根。如果你有一棵骨骼节点树,那么深度最低的节点将是根节点!
获得每个骨骼的动画矩阵后,您还需要知道影响每个顶点的骨骼数量以及该影响的权重。然后您可以在 CPU 或 GPU 上计算变形的顶点。请注意 both have their pros and cons。
中描述了对骨骼动画的更好解释,但使用了 Assimp 库
总体而言,骨骼动画整体逻辑简单;困难的部分是导航包含所有数据的数据结构并构建正确的动画矩阵、识别骨架的根节点以及从顶点到 bone/animation 数据的映射。
我正在尝试在 Android 的 OpenGL ES2 中实现骨骼动画,我有一个使用 io_three 从 Blender 导出的 JSON 模型,我可以从这个文件中读取每个骨骼数组一个有位置作为 3 个浮点数数组,四元数旋转为 4 个浮点数数组和比例以及一个作为父级的整数,我还有一个动画,据我所知,它具有层次结构列表,它每帧处理每个骨骼矩阵,每个层次结构都有一个父级和列表keys 每个键都有与骨骼相同的组件,所以我阅读了很多教程并做了很多尝试但不幸的是我没有成功,我需要简单的逻辑解释。 所以我有一个骨骼 class 每个骨骼都有向量,我可以获得每个骨骼的相对矩阵,然后将它与父级绝对矩阵相乘以获得骨骼的绝对矩阵,然后将其求逆以获得逆矩阵, 我可以对每个键进行相同的计算,但我不能将它们绑定在一起,我需要了解骨骼和每个帧之间的关系。 我的问题不在于代码,而在于逻辑。
我将尝试解释如何在动画的某些 t
处计算动画骨架,其中 t
介于整个动画的开始和结束时间之间。
I can read from this file Bones array each one has Position as 3 floats array, quaternion rotation as 4 floats array and scale
您还必须拥有上述的时间数据,即如果您的动画中有 17 帧,则每帧的时间信息。假设你有这个或者可以从 io_three
获得这个数据,你可以计算动画矩阵。更细化的步骤是:
- 查找时间
t
的位置数据,即您找到时间为t1
和t2
的 2 帧,使得:t1 < t < t2
。现在您可以计算内插平移矩阵了。 - 与 1 类似,计算内插旋转和缩放矩阵。
- 现在从您刚刚计算的 T、R、S 矩阵中找到局部动画矩阵:A。
- 接下来将局部动画矩阵与骨骼反向绑定变换相乘。
- 现在与父矩阵相乘,得到一个累积动画矩阵。
你可以看到这种computation here: note that it is in ObjectiveC, using Assimp的样本。
您将为骨架中的每个骨骼执行步骤 1 到 4,并从骨架的根部一直向下遍历,这确保每个骨骼都有一个累积动画矩阵。您从 IdentityMatrix
作为父矩阵开始。
因为你必须从骨架的根开始,所以你也必须知道那个根。您的数据要么提供骨架的根,要么必须派生骨架根。如果你有一棵骨骼节点树,那么深度最低的节点将是根节点!
获得每个骨骼的动画矩阵后,您还需要知道影响每个顶点的骨骼数量以及该影响的权重。然后您可以在 CPU 或 GPU 上计算变形的顶点。请注意 both have their pros and cons。
中描述了对骨骼动画的更好解释,但使用了 Assimp 库总体而言,骨骼动画整体逻辑简单;困难的部分是导航包含所有数据的数据结构并构建正确的动画矩阵、识别骨架的根节点以及从顶点到 bone/animation 数据的映射。