我试图从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)
的熟悉结果)?如果没有可用的函数,我想了解旋转单位矩阵和设置单位矩阵的旋转之间的区别。
答案 0 :(得分:1)
glm::eulerAngleXYZ
完全符合您的需要。问题是你的autodesk函数使用度数,glm使用弧度。您可以看到FbxAMatrix::SetR
部分中的非单位数字是15度的正弦和余弦,而glm::eulerAngleXYZ
中的数字是15的正弦和余弦。因此,要获得所需的等效数字,您可以使用方法:
glm::eulerAngleXYZ(
x / 180 * PI,
y / 180 * PI,
z / 180 * PI
);
在您的情况下,为x=15
和y=z=0
。