我正在尝试使用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旋转矩阵的定义不同?它背后的理论是什么?
答案 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.x
与c + ((1 - c) * axis.x * axis.x)
相同。不要忘记运算符优先级。
您很可能遇到浮点精度损失问题。