如何在Blender中为电枢内部计算绑定矩阵

时间:2019-08-18 11:19:45

标签: c++ blender

我努力工作了好几天,试图了解Blender如何计算骨架中骨骼的结合矩阵。我不想导出每个骨骼的绑定矩阵,而是想提取它们的头和尾巴位置以及滚动,将它们导入到另一个项目中并在那里计算绑定矩阵。这样可以节省文件空间。

我遍历了源代码,似乎从source/blender/editors/armature/armature_edit.c完成了从骨骼位置和滚动到矩阵的转换。但是,我对代码的理解不够透彻,无法弄清楚他们是如何做到的。

我尝试使用C ++重新创建我认为的实现方式。我使用右手坐标系和Y轴只是因为我更容易使用它,所以在进行计算以比较结果之后,我不得不将结果转换为Blender的坐标系。

搅拌器中的骨骼具有headtailroll参数。为了计算前向轴,我们计算了头和尾之间的差向量。接下来是我不确定的部分。我想象一个lookAt矩阵是使用骨骼所面向的方向(将是前向矢量)和全局Up矢量构造的。像这样:

Matrix4 LookAtMatrix(Vector3 headPos, Vector3 tailPos, Vector3 worldUp) {    
   Vector3 Forward = normalize(tailPos - headPos);
   Vector3 Right = normalize(cross(worldUp, Forward));
   Vector3 Up = normalize(cross(Forward, Right));

   Matrix4 M;
   M[0][0] = Right.x;
   M[0][1] = Right.y;
   M[0][2] = Right.z;
   M[0][3] = 0.0f;
   M[1][0] = Up.x;
   M[1][1] = Up.y;
   M[1][2] = Up.z;
   M[1][3] = 0.0f;
   M[2][0] = Forward.x;
   M[2][1] = Forward.y;
   M[2][2] = Forward.z;
   M[2][3] = 0.0f;
   M[3][0] = headPos.x;
   M[3][1] = headPos.y;
   M[3][2] = headPos.z;
   M[3][3] = 1.0f;

   return M;
}

我们计算骨骼的方向矩阵。但是它也有一个滚动值,也就是绕其前轴旋转。因此,正如我所看到的,我们需要从该侧倾角创建一个旋转矩阵,并将其与方向矩阵相乘。由于矩阵乘法是从右到左完成的,因此我认为正确的顺序是Matrix4 resultingMatrix = lookAtMatrix * rotationMatrix。因此,我们绕着全局前进轴(在这种情况下为Z轴)旋转骨骼,并将其乘以lookAtMatrix。我从欧拉角Z构造了RotationMatrix

 Matrix4 RotationMatrix = eulerAngleZ(rollInRadians);

在完成所有计算之后,我得到的结果矩阵具有正确的前向轴。但是右轴和上轴与我在Blender中得到的不对应。正确定向骨骼所需的滚动不同。我试图了解为什么会这样,但一直无法弄清楚。在Blender中尝试将骨骼设置为不同方向时,滚动值的差异是随机的。

0 个答案:

没有答案