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.x
与c + ((1 - c) * axis.x * axis.x)
相同。不要忘记运算符优先级。
您很可能遇到浮点精度损失问题。
【讨论】:
以上是关于GLM 旋转矩阵与预期结果不同的主要内容,如果未能解决你的问题,请参考以下文章