首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Assimp计算骨

Assimp计算骨
EN

Stack Overflow用户
提问于 2016-04-10 15:00:18
回答 1查看 2.3K关注 0票数 1

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

这是我的骨加载代码:

代码语言:javascript
复制
// 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);

然后我就把这个寄给我的着色器

代码语言:javascript
复制
glUniformMatrix4fv(MatrixArray, bone_count, GL_FALSE, &MATRIX_BUFFER[0][0][0]);

并将其应用于顶点着色器中:

代码语言:javascript
复制
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列
  • 我还不需要读取场景的节点,因为它们是用于动画的。

如果我对最后两件事弄错了,请纠正我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-10 16:03:19

我设法解决了。结果发现,DO需要读取节点,即使是简单的绑定姿态也不需要动画。对于任何未来的读者,这个问题,每个骨头矩阵= root_node_inverse *矩阵连接从节点高度*骨偏移矩阵。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36531344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档