OpenGL3.3使用Assimp导入骨骼

tech2023-10-11  89

我们在每个顶点中添加骨骼数组 如图: Weight是每个骨骼对该顶点的权重 总共加起来不能超过1

骨骼 ID 是存放所有骨骼变换的数组中的索引,这些变换会在进行 WVP 变换之前作用到位置向量和法线向量上(即将顶点从骨骼空间中变换到局部坐标系中)

骨骼树中的骨骼变换是在骨骼空间中进行的(每个骨骼都有其自己的坐标系所以我们需要将所有的变换乘在一起 偏移矩阵的工作就是将顶点位置坐标从模型的局部坐标系变换到当前骨骼的骨骼空间中。

骨骼树中的每一个节点都保存了一个指向其父节点的指针和一个保存其所有子节点指针的数组 节点中还保存了一个从当前骨骼空间变换到其父节点空间的变换矩阵 每个骨骼节点还应该有一个字符串用于保存节点名 如果一个节点代表了骨骼层级结构中的一个骨骼,那么节点名必须与骨骼名相匹配。但是某些情况下节点的名字可以为空(这表示这个节点没有对应的骨骼)

aiScene 对象中保存了aiAnimation 数组 每一个 aiAnimation 对象都表示一个动画帧序列,例如行走、跑、射击等动作。通过在关键帧之间插值,我们就可以得到与当前动作像匹配的视觉效果 一个 aiAnimation 节点中保存了一个用 tick 计数的持续时间,以及每秒的 tick 数(例如: 如果持续时间为 100 tick, 每秒的 tick 值为 25,这表示整个动作的持续时间为 4 秒) 这使得我们能在不同的硬件平台上保持动画表现的一致性。此外每一个元素中还有一个 aiNodeAnim 对象数组,数组名为 channels 。数组中的每一个元素中存放的实际上就是一个骨骼的变换信息,这些信息里面同样保存了一个骨骼名字符串和三个分别表示缩放、旋转、平移的数组。 为了计算出某个时刻骨骼最终的变换矩阵,我们需要根据当前时间对关键帧之间三个变换数组进行插值,并将这些变换组合成一个矩阵。这些完成之后我们需要在骨骼树种找到对应的骨骼节点并遍历其父节点,之后我们对它的每个父节点都做同样的插值处理,并将这些变换矩阵乘起来即可。

骨骼的最终变换矩阵是这样计算出来的:首先是偏移矩阵,这个矩阵将顶点从模型局部坐标系变换到骨骼空间中;其次会乘上根据当前运动时间计算出来的节点变换矩阵。

m_BoneMapping是什么 存放骨骼名和骨骼 ID 的 map 结构 保存了节点名与节点 ID 的对应关系 通过这个节点 ID 我们也可以在 m_BoneInfo 数组中得到每个骨骼的变换矩阵 m_BoneInfo是什么 BoneInfo是什么 m_Entries是什么

这个导入对象不要在栈区创建,因为栈区创建的局部对象析构后,importer会把它加载的aiScene* scene 对象一起释放了,但是计算插值骨骼信息是需要保存aiScene指针的。

最新回复(0)