OpenGL骨架动画逻辑

时间:2016-12-25 11:25:19

标签: java android opengl-es opengl-es-2.0 skeletal-animation

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

1 个答案:

答案 0 :(得分:2)

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

  

我可以从这个文件读取Bones数组每个都有Position作为3浮点数组,四元数旋转为4浮点数组和比例

您还必须拥有上述的时间数据,即如果您在动画中说过17帧,则每帧的时间信息。假设你有这个或者可以从io_three获得这些数据,你可以计算动画矩阵。更精细的步骤是:

  1. 查找时间t的位置数据,即您找到时间为t1t2的2帧,以便:t1 < t < t2。现在,您可以计算插值平移矩阵。
  2. 与1类似,计算插值的旋转和缩放矩阵。
  3. 现在找到本地动画矩阵:来自您刚刚计算的T,R,S矩阵。
  4. 接下来将局部动画矩阵与骨骼反向绑定变换相乘。
  5. 现在与父矩阵相乘,以便您有一个累积动画矩阵。
  6. 您可以看到此类computation here的示例:请注意,它位于ObjectiveC中,使用Assimp

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

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

    获得每个骨骼的动画矩阵后,您还需要知道影响每个顶点的骨骼数量以及该影响的权重。然后,您可以在CPU或GPU上计算变形顶点。请注意both have their pros and cons

    这个post's top answer中描述了骨架动画的更好解释,但是使用了Assimp库。

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