【问题标题】:Assimp Skeletal Animation Transform Matrix IssuesAssimp 骨骼动画变换矩阵问题
【发布时间】: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


    【解决方案1】:

    我解决了。问题很简单——aiBone 中的骨骼偏移矩阵已经是global / combined,所以没有理由连接。

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 2020-09-27
      • 2017-04-10
      • 2015-05-25
      • 2017-05-05
      • 2014-09-23
      • 2017-07-22
      • 2019-06-30
      • 2020-08-11
      相关资源
      最近更新 更多