【发布时间】:2015-07-21 07:47:43
【问题描述】:
我正在尝试使用 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 和 根节点。
以类似的方式加载变换矩阵,但使用mNumChannels 中的aiNodeAnim 而不是mNumBones 中的aiBones。
我想最终结果看起来像这样:
M = Arm * Hand * Finger * RootNode * Offset_Arm * Offset_Hand * Offset_Finger;
我不知道为什么 RootNode 矩阵存在,但如果不存在,一切看起来都是无稽之谈。
知道是什么原因造成的,或者我能做什么?
【问题讨论】:
标签: c++ opengl matrix assimp skeletal-mesh