我正在尝试使用 Assimp(开放资产导入库)制作骨骼动画。现在我可以成功地加载一个 .dae 模型并用动画渲染它,但在这样做的过程中,模型变得混乱了。
http://i.imgur.com/O7YzK8o.png
左侧模型未正确装配和加载。右边的模型被操纵并从动画中采取了正确的姿势,但奇怪地扭曲了(扁平棒图~)。
我的看法是,我可能通过骨骼矩阵乘法做错了什么。
最终矩阵(我们称它们为 M)计算如下:
M[i] = transform_matrix[i] * scene->mRootNode->mTransformation * offset_matrix[i]
其中offset_matrix[i]
是来自 的串联的组合偏移矩阵aiBone->mOffsetMatrix
,并且transform_matrix[i]
是来自aiNodeAnim
TRS 的矩阵串联的组合变换矩阵。
从底部到根部分别进行连接。
while(node!=NULL){
mOffset = loadRelativeOffset(node, scene) * mOffset
node = node->mParent;
}
offset_matrix.push_back(mOffset);
loadRelativeOffset(node, scene)
将循环scene->mMeshes[0]->mNumBones
并返回匹配的矩阵aiBone
。如果没有找到骨骼,则返回单位矩阵。因此,最终结果将是所有骨骼矩阵的串联,忽略Armature和根节点。
加载变换矩阵以类似的方式完成,但使用aiNodeAnim
inmNumChannels
而不是aiBones
in mNumBones
。
我想最终结果看起来像这样:
M = Arm * Hand * Finger * RootNode * Offset_Arm * Offset_Hand * Offset_Finger;
我不知道为什么 RootNode 矩阵存在,但如果它不存在,那么一切看起来都是无稽之谈。
知道是什么原因造成的,或者我能做什么?