Assimp中错误的骨骼旋转

时间:2020-06-12 08:01:47

标签: visual-studio-2019 mesh assimp skeletal-animation gl-matrix

最近我正在研究在Visual Studio C ++中使用Assimp变换给定骨骼(旋转一定角度)的方法。

我在许多站点阅读了执行此操作的过程,但仍然无法通过矩阵乘法阶次的多次试验发现错误。

我正在做的事情是得到一个模型,我首先找到perVertexBone数据,然后在进行任何变换之前找到骨骼位置,然后使用线性权重分配来表示Model中所有顶点,并使用先前计算的perVertexBone数据表示骨骼。因此,初始模型如下所示(以Obj格式打印顶点位置)->

enter image description here

转换过程:

然后我正在做的是(从脖子节点旋转到网格的头部):

1。找到颈部节点并更改
neckNode-> mtransformation = GlmToaiMatrix4x4(glm :: mat4(1.57f))
(我已经将aiMatrix的函数转置为glm :: mat4转换)。

2。然后我调用visitNode(neckNode)函数,该函数是->

void visitNode(aiNode*node)
{
   string NodeName(node->mName.data);
   glm::mat4 globalTransformation=glm::mat4(1.0f);

   if(boneMap.count(NodeName))
   {
      aiNode*tmp=node;

      while(tmp!=0){
      glm::mat4 mat=aiMatrix4x4ToGlm(tmp->mTransformation);
      globalTransformation=mat*globalTransformation;    // If i change this 
                                            // order whole model is distorted  
      tmp=tmp->mParent;
      }
      boneMap[NodeName]=boneOffsetInverse[NodeName]*globalTransformation*boneOffset[NodeName];
   }

 for(int i=0;i<node->mNumChildren;i++)
 {
    visitNode(node->mChildren[i]);      
 }
}

此后,我再次从此boneMap计算出boneLocations并基于perVertexBonedata分配顶点并打印顶点位置,从而得到这样的模型(以Obj格式打印顶点位置)->

enter image description here

您可以看到模型的颈部到头部部分拉伸得太远了。

注意::Initailly还调用了一个visitNode()类型的函数,以将其存储在骨骼骨架的boneMap层次结构中,并在其中传递mRootNode来打印初始模型顶点。

所以任何人都可以建议我在做什么错。我已经尝试了许多不同的方式一周,但这是我能达到的最接近的方式。我需要此步骤进行项目,这是最关键的步骤,没有它,我将无法继续前进。 >

任何建议都会受到赞赏。

0 个答案:

没有答案