Assimp骨骼动画转换矩阵问题

时间:2015-05-10 21:38:44

标签: c++ opengl matrix assimp skeletal-mesh

我正在尝试使用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中的mNumChannels代替aiBones中的mNumBones

我想最终结果看起来像这样:

M = Arm * Hand * Finger * RootNode * Offset_Arm * Offset_Hand * Offset_Finger;

我不知道为什么RootNode矩阵在那里,但如果不存在,一切看起来都像废话。

知道导致这种情况的原因,或者我能做些什么?

1 个答案:

答案 0 :(得分:2)

我解决了。问题非常简单 - aiBone中的骨骼偏移矩阵已经全局 / 组合,所以没有理由连接。