1

我正在尝试使用 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]是来自aiNodeAnimTRS 的矩阵串联的组合变换矩阵。

从底部到根部分别进行连接。

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根节点

加载变换矩阵以类似的方式完成,但使用aiNodeAniminmNumChannels而不是aiBonesin mNumBones

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

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

我不知道为什么 RootNode 矩阵存在,但如果它不存在,那么一切看起来都是无稽之谈。

知道是什么原因造成的,或者我能做什么?

4

1 回答 1

2

我解决了。问题非常简单 - 中的骨骼偏移矩阵aiBone已经是global / combine,因此没有理由连接。

于 2015-05-12T00:00:35.147 回答