GLM 旋转矩阵与预期结果不同

Posted

技术标签:

【中文标题】GLM 旋转矩阵与预期结果不同【英文标题】:GLM rotation matrix differs from expected result 【发布时间】:2016-02-03 19:46:14 【问题描述】:

我正在尝试使用 glm::gtc::matrix_transform::rotate: 围绕 X 轴创建一个旋转矩阵:

glm::rotate(glm::mat4f(1.0f), glm::radians(90.f), glm::vec3f(1.f, 0.f, 0.f));

我希望得到的矩阵是(删除平移偏移):

1,       0,        0
0, cos(90), -sin(90)
0, sin(90),  cos(90)
0,       0,        0

(参见例如https://en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations)

但是,结果略有偏差,即:

1,         0,          0
0, 0.9996240, -0.0274121
0, 0.0274121,  0.9996240
0,         0,          0

我查看了https://github.com/g-truc/glm/blob/master/glm/gtc/matrix_transform.inl,果然,该实现使用了一个奇怪的因子 c + (1 - c) 来解释结果。

我现在的问题是,为什么?为什么glm的旋转矩阵定义不一样?其背后的理论是什么?

【问题讨论】:

glm不使用“奇数因子”,它使用众所周知的公式来围绕任意轴(其在选择特定轴时的基础旋转)。请注意,通用公式在您已经链接的同一篇***文章中给出。完全不清楚你在做什么,我无法用 glm 重现这种效果。 【参考方案1】:

glm 实现使用来自***的this 公式。 以下代码行与公式相同:

Result[0][0] = c + (1 - c)      * axis.x     * axis.x;
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z;
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y;
Result[0][3] = 0;

Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z;
Result[1][1] = c + (1 - c) * axis.y * axis.y;
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x;
Result[1][3] = 0;

Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y;
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x;
Result[2][2] = c + (1 - c) * axis.z * axis.z;
Result[2][3] = 0;

c + (1 - c) 没有什么奇怪的,因为c + (1 - c) * axis.x * axis.xc + ((1 - c) * axis.x * axis.x) 相同。不要忘记运算符优先级。

您很可能遇到浮点精度损失问题。

【讨论】:

以上是关于GLM 旋转矩阵与预期结果不同的主要内容,如果未能解决你的问题,请参考以下文章

GLSL 2D 旋转矩阵无法按预期工作

GLM 从 vec3 制作旋转矩阵

使用 glm 根据光标位置旋转模型视图矩阵

如何使用 glm::mat4 手动正确编写旋转矩阵?

从旋转矩阵获取绕 y 轴的旋转

使用 GLM(旋转)为 OpenGL 创建变换矩阵