在glm :: mat4中设置矩阵旋转

时间:2016-02-12 06:26:54

标签: matrix rotation glm-math fbx

我试图从Autodesk FBX SDK中移植一些代码来改为使用glm。 Autodesk SDK有一个名为FbxAMatrix的类(FBX仿射矩阵类 - 类似于glm::mat4),它提供了功能:

void SetR(const FbxVector4& pR); /* Set matrix's Euler rotation. X, Y and Z rotation values expressed as a vector. The rotation transform is constructed in rotation order XYZ. */

此函数用于设置旋转 - 而glm::rotate()只会旋转矩阵。根据我的理解,这是两个不同的操作 - 如果我使用相同的输入运行两个函数,结果也是不同的。如果我尝试使用glm::eulerAngleXYZ(),则会出现同样的问题。

IdentityMatrix:

{ 1, 0, 0, 0 }
{ 0, 1, 0, 0 }
{ 0, 0, 1, 0 }
{ 0, 0, 0, 1 }

RotationVector:

{ 15 }
{ 0 }
{ 0 }

FbxAMatrix :: IdentityMatrix.SetR(RotationVector):

 { 1, 0, 0, 0 }
 { 0, 0.96592582628906831, 0.25881904510252074, 0 } 
 { 0, 0.25881904510252074, 0.96592582628906831, 0 } 
 { 0, 0, 0, 1 }

glm :: rotate(IdentityMatrix,1.0f,RotationVector):

 { 1, 0, 0, 0 }
 { 0, 0.540302277, 0.841470957, 0 }
 { 0, 0.841470957, 0.540302277, 0 }
 { 0, 0, 0, 1 }

GLM :: eulerAngleXYZ(RotationVector):

 { 1, 0, 0, 0 }
 { 0, 0.759687901, 0.650287867, 0 }
 { 0, 0.650287867, 0.759687901, 0 }
 { 0, 0, 0, 1 }

所以我的问题是:如何用glm设置矩阵的旋转(以获得FbxAMatrix.SetR(RotationVector)的熟悉结果)?如果没有可用的函数,我想了解旋转单位矩阵和设置单位矩阵的旋转之间的区别。

1 个答案:

答案 0 :(得分:1)

glm::eulerAngleXYZ完全符合您的需要。问题是你的autodesk函数使用度数,glm使用弧度。您可以看到FbxAMatrix::SetR部分中的非单位数字是15度的正弦和余弦,而glm::eulerAngleXYZ中的数字是15的正弦和余弦。因此,要获得所需的等效数字,您可以使用方法:

glm::eulerAngleXYZ(
  x / 180 * PI,
  y / 180 * PI,
  z / 180 * PI
);
在您的情况下,

x=15y=z=0