不正确的骨骼变换 Assimp
Incorrect Bone Transforms Assimp
我在创建骨骼动画时遇到问题,我的模型转换不正确
void Animation(glm::mat4 a[])
{
float Factor= fmod(glfwGetTime(),1.0);
for(int b=0;b<BoneList.size();b++)
{
Bone *BoneT = &BoneList[b];
aiMatrix4x4 temp = inverse;
while(BoneT)
{
aiVector3D sc= BoneT->ScaleFrame[0] + (Factor * (BoneT->ScaleFrame[1] - BoneT->ScaleFrame[0]));
aiMatrix4x4 S=aiMatrix4x4();
S[0][0]=sc.x;
S[1][1]=sc.y;
S[2][2]=sc.z;
aiVector3D tr= BoneT->LocFrame[0] + (Factor * (BoneT->LocFrame[1] - BoneT->LocFrame[0]));
aiMatrix4x4 T=aiMatrix4x4();
T[0][3]=tr.x;
T[1][3]=tr.y;
T[2][3]=tr.z;
aiQuaternion R;
aiQuaternion::Interpolate(R, BoneT->RotFrame[0], BoneT->RotFrame[1], Factor);
R = R.Normalize();
temp*=BoneT->NodeTransform*(T* aiMatrix4x4(R.GetMatrix()) * S );
BoneT=BoneT->BoneParent;
}
temp*=BoneList[b].offset;
temp.Transpose();
ai_to_glm(temp,a[b]);
}
}
我正在创建一个临时 aiMatrix4x4 来保留 assimp 矩阵乘法顺序,然后我使用函数将 aiMatrix4x4 转换为 glm::mat4:
void ai_to_glm(const aiMatrix4x4 &from, glm::mat4 &to)
{
to[0][0] = from[0][0];
to[0][1] = from[0][1];
to[0][2] = from[0][2];
to[0][3] = from[0][3];
to[1][0] = from[1][0];
to[1][1] = from[1][1];
to[1][2] = from[1][2];
to[1][3] = from[1][3];
to[2][0] = from[2][0];
to[2][1] = from[2][1];
to[2][2] = from[2][2];
to[2][3] = from[2][3];
to[3][0] = from[3][0];
to[3][1] = from[3][1];
to[3][2] = from[3][2];
to[3][3] = from[3][3];
}
但是模型的结束帧是这样的:
我注意到如果我从函数中删除平移矩阵,模型看起来更接近它应该是的样子
蒙皮在着色器中完成
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 Tpos;
layout (location = 2) in ivec4 Bones;
layout (location = 3) in vec4 Weight;
uniform mat4 view;
uniform mat4 proj;
uniform mat4 LocRot;
uniform mat4 Test[8];
out vec3 vertexColor;
out vec2 TextCoord;
void main()
{
mat4 BoneTransform = Test[Bones.x]* Weight.x;
BoneTransform += Test[Bones.y] * Weight.y;
BoneTransform += Test[Bones.z] * Weight.z;
BoneTransform += Test[Bones.w] * Weight.w;
gl_Position = proj * view *LocRot* BoneTransform *vec4(aPos, 1.0);
vertexColor = vec3(1,1,1);
TextCoord = Tpos;
}
制服获得
for(int i=0; i<4;i++)
{
glUniformMatrix4fv(glGetUniformLocation(ActiveShader->ID, "Test[0]")+i, 1, GL_FALSE, glm::value_ptr(AnimMatrix[i]));
}
我所知道的:
-逆矩阵是单位矩阵,现在对这个模型没有任何作用。
-一些权重和不等于 1.0 但我认为这不是问题
-改变矩阵乘法顺序没有解决
在 blender 中创建并导出模型
link 到模型 https://send.firefox.com/download/fe0b85d3f4581630/#6S0Vr9EIjgLNN03rerMW0w
我敢打赌 ai_to_glm 函数在这里有问题,但我不确定。
编辑:我注意到旋转也被翻转了,如图所示,但是将它乘以 inverseai(反向根骨变换)没有任何作用。
更新:我在转换之前转置了 assimp 矩阵,它解决了大部分问题,但是偏移量和父继承被窃听了
在任何怀疑之前,我不知道我有帐户堆栈溢出,我从我的真实帐户回答这个问题
要解决这个问题,需要做很多事情:
迭代骨骼和分配 children/parents 使用不稳定的指针并已损坏,解决后它修复了主要问题
我使用了 codingadventures 对问题
的回答
我的ai_to_glm错了,替换成
后
glm::mat4 ai_to_glm(aiMatrix4x4* 来自)
{
glm::mat4 到 = glm::mat4(1.0f);
to[0][0] = (GLfloat)from->a1; to[0][1] = (GLfloat)from->b1; to[0][2] = (GLfloat)from->c1; to[0][3] = (GLfloat)from->d1;
to[1][0] = (GLfloat)from->a2; to[1][1] = (GLfloat)from->b2; to[1][2] = (GLfloat)from->c2; to[1][3] = (GLfloat)from->d2;
to[2][0] = (GLfloat)from->a3; to[2][1] = (GLfloat)from->b3; to[2][2] = (GLfloat)from->c3; to[2][3] = (GLfloat)from->d3;
to[3][0] = (GLfloat)from->a4; to[3][1] = (GLfloat)from->b4; to[3][2] = (GLfloat)from->c4; to[3][3] = (GLfloat)from->d4;
return 至;
};
之后,它得到修复
我在创建骨骼动画时遇到问题,我的模型转换不正确
void Animation(glm::mat4 a[])
{
float Factor= fmod(glfwGetTime(),1.0);
for(int b=0;b<BoneList.size();b++)
{
Bone *BoneT = &BoneList[b];
aiMatrix4x4 temp = inverse;
while(BoneT)
{
aiVector3D sc= BoneT->ScaleFrame[0] + (Factor * (BoneT->ScaleFrame[1] - BoneT->ScaleFrame[0]));
aiMatrix4x4 S=aiMatrix4x4();
S[0][0]=sc.x;
S[1][1]=sc.y;
S[2][2]=sc.z;
aiVector3D tr= BoneT->LocFrame[0] + (Factor * (BoneT->LocFrame[1] - BoneT->LocFrame[0]));
aiMatrix4x4 T=aiMatrix4x4();
T[0][3]=tr.x;
T[1][3]=tr.y;
T[2][3]=tr.z;
aiQuaternion R;
aiQuaternion::Interpolate(R, BoneT->RotFrame[0], BoneT->RotFrame[1], Factor);
R = R.Normalize();
temp*=BoneT->NodeTransform*(T* aiMatrix4x4(R.GetMatrix()) * S );
BoneT=BoneT->BoneParent;
}
temp*=BoneList[b].offset;
temp.Transpose();
ai_to_glm(temp,a[b]);
}
}
我正在创建一个临时 aiMatrix4x4 来保留 assimp 矩阵乘法顺序,然后我使用函数将 aiMatrix4x4 转换为 glm::mat4:
void ai_to_glm(const aiMatrix4x4 &from, glm::mat4 &to)
{
to[0][0] = from[0][0];
to[0][1] = from[0][1];
to[0][2] = from[0][2];
to[0][3] = from[0][3];
to[1][0] = from[1][0];
to[1][1] = from[1][1];
to[1][2] = from[1][2];
to[1][3] = from[1][3];
to[2][0] = from[2][0];
to[2][1] = from[2][1];
to[2][2] = from[2][2];
to[2][3] = from[2][3];
to[3][0] = from[3][0];
to[3][1] = from[3][1];
to[3][2] = from[3][2];
to[3][3] = from[3][3];
}
但是模型的结束帧是这样的:
我注意到如果我从函数中删除平移矩阵,模型看起来更接近它应该是的样子
蒙皮在着色器中完成
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 Tpos;
layout (location = 2) in ivec4 Bones;
layout (location = 3) in vec4 Weight;
uniform mat4 view;
uniform mat4 proj;
uniform mat4 LocRot;
uniform mat4 Test[8];
out vec3 vertexColor;
out vec2 TextCoord;
void main()
{
mat4 BoneTransform = Test[Bones.x]* Weight.x;
BoneTransform += Test[Bones.y] * Weight.y;
BoneTransform += Test[Bones.z] * Weight.z;
BoneTransform += Test[Bones.w] * Weight.w;
gl_Position = proj * view *LocRot* BoneTransform *vec4(aPos, 1.0);
vertexColor = vec3(1,1,1);
TextCoord = Tpos;
}
制服获得
for(int i=0; i<4;i++)
{
glUniformMatrix4fv(glGetUniformLocation(ActiveShader->ID, "Test[0]")+i, 1, GL_FALSE, glm::value_ptr(AnimMatrix[i]));
}
我所知道的: -逆矩阵是单位矩阵,现在对这个模型没有任何作用。
-一些权重和不等于 1.0 但我认为这不是问题
-改变矩阵乘法顺序没有解决
在 blender 中创建并导出模型
link 到模型 https://send.firefox.com/download/fe0b85d3f4581630/#6S0Vr9EIjgLNN03rerMW0w
我敢打赌 ai_to_glm 函数在这里有问题,但我不确定。
编辑:我注意到旋转也被翻转了,如图所示,但是将它乘以 inverseai(反向根骨变换)没有任何作用。
更新:我在转换之前转置了 assimp 矩阵,它解决了大部分问题,但是偏移量和父继承被窃听了
在任何怀疑之前,我不知道我有帐户堆栈溢出,我从我的真实帐户回答这个问题
要解决这个问题,需要做很多事情:
迭代骨骼和分配 children/parents 使用不稳定的指针并已损坏,解决后它修复了主要问题
我使用了 codingadventures 对问题
的回答我的ai_to_glm错了,替换成
后glm::mat4 ai_to_glm(aiMatrix4x4* 来自) { glm::mat4 到 = glm::mat4(1.0f); to[0][0] = (GLfloat)from->a1; to[0][1] = (GLfloat)from->b1; to[0][2] = (GLfloat)from->c1; to[0][3] = (GLfloat)from->d1; to[1][0] = (GLfloat)from->a2; to[1][1] = (GLfloat)from->b2; to[1][2] = (GLfloat)from->c2; to[1][3] = (GLfloat)from->d2; to[2][0] = (GLfloat)from->a3; to[2][1] = (GLfloat)from->b3; to[2][2] = (GLfloat)from->c3; to[2][3] = (GLfloat)from->d3; to[3][0] = (GLfloat)from->a4; to[3][1] = (GLfloat)from->b4; to[3][2] = (GLfloat)from->c4; to[3][3] = (GLfloat)from->d4; return 至; };
之后,它得到修复