我制作了一个非常简单的3D场景,在世界坐标中有5个点。我想浏览场景,所以我定义了一个带UP和OUT矢量的摄像机。有了这些信息,我会在每一帧中生成一个旋转矩阵,我将它应用于矢量以获得相机坐标。
问题是:我使用这种方法读过关于万向节锁定的问题,但在这种情况下会发生吗?
请注意,我正在每帧中生成旋转矩阵,而且我不会累积旋转。那么在这种情况下会发生锁定吗?如果是这种情况,你会建议安全地应用一个旋转(从UP和OUT向量)?
谢谢
答案 0 :(得分:4)
如果由OUT表示“向前”,并且这总是垂直于向上矢量,那么否,您将不会遇到万向节锁定。
您正在做的是从UP和FORWARD向量创建方向矩阵,并应用每个帧,这是在太空中移动相机的一种相当常用的方法。 您没有使用欧拉角应用多次旋转,这可能是万向节锁定的原因。
注意要创建矩阵,您还需要从UP和FORWARD向量创建“左”(或右)向量。对此的一个很好的介绍是here - 请注意,该示例然后将旋转应用于相机矩阵,这是完全可选的步骤。
维基百科对gimbal lock有很好的解释。
答案 1 :(得分:1)
当使用矩阵方法生成旋转矩阵(对于X,Y,Z)然后将它们相乘以获得最终旋转矩阵时,您将遇到万向节锁定问题。如果我已经理解你的意愿,你可以使用OUT向量来获得角度(alpha,beta,gamma),然后你计算矩阵,最后 - 你将它们相乘得到最终的旋转矩阵 - 然后是的,你会遇到万向节锁。
解决此问题的一种方法是使用Quaternions进行计算。
另外,here我找到了一些关于如何实现它们的OpenGL教程。