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

Set matrix rotation in glm::mat4

我正在尝试从 Autodesk FBX SDK 移植一些代码以改用 glm。 Autodesk SDK 有一个名为 FbxAMatrix 的 class(FBX 仿射矩阵 class - 类似于 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(),也会发生同样的问题。

身份矩阵:

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

旋转向量:

{ 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) 的相似结果)?如果没有可用的函数,我想了解旋转单位矩阵和设置单位矩阵旋转的区别。

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