在 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=15
和 y=z=0
。
我正在尝试从 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=15
和 y=z=0
。