最近我正在研究在Visual Studio C ++中使用Assimp变换给定骨骼(旋转一定角度)的方法。
我在许多站点阅读了执行此操作的过程,但仍然无法通过矩阵乘法阶次的多次试验发现错误。
我正在做的事情是得到一个模型,我首先找到perVertexBone数据,然后在进行任何变换之前找到骨骼位置,然后使用线性权重分配来表示Model中所有顶点,并使用先前计算的perVertexBone数据表示骨骼。因此,初始模型如下所示(以Obj格式打印顶点位置)->
转换过程:
然后我正在做的是(从脖子节点旋转到网格的头部):
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格式打印顶点位置)->
您可以看到模型的颈部到头部部分拉伸得太远了。
注意::Initailly还调用了一个visitNode()类型的函数,以将其存储在骨骼骨架的boneMap层次结构中,并在其中传递mRootNode来打印初始模型顶点。
所以任何人都可以建议我在做什么错。我已经尝试了许多不同的方式一周,但这是我能达到的最接近的方式。我需要此步骤进行项目,这是最关键的步骤,没有它,我将无法继续前进。 >
任何建议都会受到赞赏。