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

时间:2016-02-03 19:46:14

标签: opengl 3d rotation glm-math

我正在尝试使用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旋转矩阵的定义不同?它背后的理论是什么?

1 个答案:

答案 0 :(得分:0)

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)相同。不要忘记运算符优先级。

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