我试着在Android中的OpenGL ES2中实现骨架动画,我有一个使用io_three从Blender导出的JSON模型,我可以从这个文件中读取Bones数组每个都有Position作为3浮点数组,四元数旋转为4浮点数组和scale以及一个父对象的整数,我也有动画,它有层次结构列表,据我所知每帧处理每个骨骼矩阵,每个层次结构都有一个父键和键列表,每个键都有与骨骼相同的组件,所以我看了很多教程并做了很多尝试,但不幸的是我没有成功,我需要简单解释逻辑。 所以我有一个骨骼类,每个人都有矢量,我可以得到每个骨骼的相对矩阵,然后将它与父绝对矩阵相乘,得到骨骼的绝对矩阵,然后反过来得到反转的矩阵, 我可以为每个键进行相同的计算但是我不能将它们绑定在一起,我需要理解骨骼和每个帧之间的关系。 我的问题不是代码,而是逻辑。
答案 0 :(得分:2)
我将尝试解释如何在动画的t
处计算动画骨架,其中t
介于整个动画的开始和结束时间之间。
我可以从这个文件读取Bones数组每个都有Position作为3浮点数组,四元数旋转为4浮点数组和比例
您还必须拥有上述的时间数据,即如果您在动画中说过17帧,则每帧的时间信息。假设你有这个或者可以从io_three
获得这些数据,你可以计算动画矩阵。更精细的步骤是:
t
的位置数据,即您找到时间为t1
和t2
的2帧,以便:t1 < t < t2
。现在,您可以计算插值平移矩阵。您可以看到此类computation here的示例:请注意,它位于ObjectiveC中,使用Assimp。
您将对骨骼中的每个骨骼执行步骤1到4,并从骨骼的根部一直向下遍历,这可确保每个骨骼都有一个累积动画矩阵。您从IdentityMatrix
开始作为父矩阵。
因为你必须从骨架的根开始,你还必须知道root。要么您的数据提供骨架的根,要么您必须派生骨架根。如果你有一个骨节点树,那么深度最小的节点将是root!
获得每个骨骼的动画矩阵后,您还需要知道影响每个顶点的骨骼数量以及该影响的权重。然后,您可以在CPU或GPU上计算变形顶点。请注意both have their pros and cons。
这个post's top answer中描述了骨架动画的更好解释,但是使用了Assimp库。
总的来说,虽然骨骼动画的整体逻辑很简单;困难的部分在于导航您的数据结构,其中包含所有数据并构建正确的动画矩阵,识别骨架的根节点以及从顶点到骨骼/动画数据的映射。