2016-12-25 112 views
0

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

回答

2

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

我可以从该文件骨骼阵列每一个有位置3个浮点数的数组,四元数旋转如图4个浮点数的数组和刻度读

你也必须具有用于上述即,如果所述定时数据你的动画中有17帧,每帧的时间信息。假设你有这个或可以从io_three获得这些数据,你可以计算动画矩阵。在更精细的步骤是:

  1. 找到位置数据时t即找到2帧,次t1t2这样:t1 < t < t2。现在您可以计算插值转换矩阵。
  2. 与1相似,计算插值旋转和比例矩阵。
  3. 现在找到本地动画矩阵:A从刚刚计算的T,R,S矩阵中获得。
  4. 接下来,将本地动画矩阵与您的骨骼逆向绑定变换相乘。
  5. 现在与父矩阵相乘,以便您有一个累积动画矩阵。

您可以看到这种computation here的示例:请注意,它位于ObjectiveC中,使用Assimp

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

由于您必须从骨架的根开始,您还必须知道根。要么你的数据提供了骨架的根,要么你必须得到骨架根。如果您有一个骨骼节点树,那么具有最低深度的节点将是root!

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

在这个post's top answer中描述了骨骼动画的更好的解释,但是使用Assimp库。总体而言,虽然骨骼动画的整体逻辑很简单,困难的部分是导航数据结构,其中包含所有数据并构建正确的动画矩阵,识别骨架的根节点以及从顶点到骨骼/动画数据的映射。

+0

清晰明了的解释,谢谢 – Mohamed