在过去的几天里,我一直在尝试使用assimp来加载我的皮肤collada网格物体,但是却非常困难。目前,我只是试图以其正常的“姿势”来渲染它,而没有任何变换或动画,但是网格变得非常变形。我认为问题出在我的骨头上,而不是我的体重上,所以我只张贴骨头部分。

这是我的骨骼加载代码:

// this is done for every bone in a for loop:
Bone new_bone;

new_bone.name = std::string(bone->mName.data);

aiMatrix4x4 b_matrix = bone->mOffsetMatrix;
aiMatrix4x4 g_inv = scene->mRootNode->mTransformation;
g_inv.Inverse(); // according to a tutorial, you have to multiply by inverse root
b_matrix = b_matrix * g_inv;
memcpy(new_bone.matrix, &b_matrix, sizeof(float) * 16);

Bones.push_back(new_bone);


然后我只需将其发送到我的着色器

glUniformMatrix4fv(MatrixArray, bone_count, GL_FALSE, &MATRIX_BUFFER[0][0][0]);


并使用以下命令将其应用到顶点着色器中:

mat4 Bone = V_MatrixArray[int(Indicies[0])] * Weights[0];
Bone += V_MatrixArray[int(Indicies[1])] * Weights[1];
Bone += V_MatrixArray[int(Indicies[2])] * Weights[2];
Bone += V_MatrixArray[int(Indicies[3])] * Weights[3];

vec4 v = Bone * vec4(Vertex, 1);
gl_Position = MVP * vec4(v.xyz, 1);


这段代码大部分都可以用,但是我的网格非常变形。。。看起来像这样:

c++ - 阿斯普恩计算骨头-LMLPHP

根据到目前为止所做的研究:


我不需要转置矩阵,因为assimp使用OpenGL column major
我不需要读取场景的节点,因为它们用于
动画


如果我对这最后两件事有误,请纠正我。

最佳答案

我设法解决了。事实证明,即使对于没有动画的简单绑定姿势,您也确实需要读取节点。对于任何将来遇到此问题的读者,每个骨骼矩阵= root_node_inverse *矩阵从节点heirechy连接到*骨骼偏移矩阵。

10-06 01:44