我正在使用C和OpenGL。我正在尝试使用骨架动画加载3D模型,但我似乎无法为动画的每个帧计算每个骨骼的绝对矩阵。
我有:对于每个骨骼,我有一个矩阵和一个逆矩阵,对于动画的每个帧,我有一个旋转(Euler)和每个骨骼的平移。
Blender导入/导出脚本:
编辑:如果有人知道如何使用blender获取骨骼的绝对矩阵并导出,那也没关系(我是Blender的新手)
for each frame f
for each bone i
glLoadIdentity();
glMultMatrixd(bones[i].matrix);
for each parent bone ii(starting from the top)
glTranslated(bones[ii].translation[f].x, bones[ii].translation[f].y, bones[ii].translation[f].z);
glRotated(bones[ii].degrees[f].z, 0.0, 0.0, 1.0);
glRotated(bones[ii].degrees[f].x, 1.0, 0.0, 0.0);
glRotated(bones[ii].degrees[f].y, 0.0, 1.0, 0.0);
glMultMatrixd(bones[i].inversematrix);
glGetDoublev(GL_PROJECTION_MATRIX, bones[i].absmatrix[f]);
答案 0 :(得分:0)
这些脚本看起来像是为过时的2.4 * x *版本的Blender编写的。对于2.5 * x * / 2.6 * x *,您有一个经过大幅改进的Python API,其中包含带有“matrix”和“matrix_local”属性的Bone个对象。
我建议您尝试使用当前版本的Blender做您想做的事情。用这种方式击打砖墙的可能性要小得多。
答案 1 :(得分:0)
在你对Lawrence的评论中,你的2.4脚本不适用于Blender 2.5是对的。但是你的问题并不复杂。你得到的矩阵是从每个骨骼到下一个骨骼的局部转换。所以你只需要在依赖树中一个接一个地将它们相乘。
所以你要做的是对树进行深度优先遍历,对于树中的每次迭代,你都要glPushMatrix(); glMultMatrix(bone_matrix);
,然后向上一步,用glPopMatrix()
反转效果;