Assimp 计算骨骼
Assimp calculating bones
过去几天我一直在尝试使用 assimp 加载我的蒙皮 collada 网格,但我遇到了非常困难的时间。目前我只是试图在没有任何转换或动画的情况下以正常 "pose" 渲染它,但网格变得非常变形。我认为问题出在我的骨骼上,而不是我的体重,所以我只发布骨骼部分。
这是我的骨骼加载代码:
// 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);
此代码大部分都有效,但是我的网格变形非常严重....看起来像这样:
根据目前所做的研究:
我不需要转置我的矩阵,因为 assimp 使用 OpenGL 列 major
我还不需要读取场景的节点,因为它们是为了
动画
如果我对最后两件事有误,请纠正我。
我设法解决了。原来你 DO 需要读取节点,即使是没有动画的简单绑定姿势。对于任何有此问题的未来读者,每个骨骼矩阵 = root_node_inverse * 从节点 heirechy * 骨骼偏移矩阵连接的矩阵。
过去几天我一直在尝试使用 assimp 加载我的蒙皮 collada 网格,但我遇到了非常困难的时间。目前我只是试图在没有任何转换或动画的情况下以正常 "pose" 渲染它,但网格变得非常变形。我认为问题出在我的骨骼上,而不是我的体重,所以我只发布骨骼部分。
这是我的骨骼加载代码:
// 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);
此代码大部分都有效,但是我的网格变形非常严重....看起来像这样:
根据目前所做的研究:
我不需要转置我的矩阵,因为 assimp 使用 OpenGL 列 major
我还不需要读取场景的节点,因为它们是为了 动画
如果我对最后两件事有误,请纠正我。
我设法解决了。原来你 DO 需要读取节点,即使是没有动画的简单绑定姿势。对于任何有此问题的未来读者,每个骨骼矩阵 = root_node_inverse * 从节点 heirechy * 骨骼偏移矩阵连接的矩阵。