OpenGL相机的相对旋转

时间:2011-07-27 12:51:22

标签: opengl matrix rotation

我目前正在努力寻找旋转我的OpenGL“相机”的公式(我尝试通过场景旋转来做,但也有同样的问题)。 基本上我的相机位于一个给定的位置,看着一个给定的点(所有指示到gluLookAt),我想向上旋转相机,例如,仍然看着同一点。

什么是正确的过程? 我应该用什么输入数据来决定运动量? 2D鼠标坐标演化或3D未投影鼠标坐标演变?

2 个答案:

答案 0 :(得分:2)

诀窍是,如果在正确的位置进行,则相机旋转与场景旋转相同。将相机移动到要旋转的 点,然后旋转相机,然后向后移出相同的距离。

旋转的数量取决于您的应用程序。以G-Earth为例:如果你靠近表面,旋转是(绝对)小的,如果你离表面很远,那么旋转很大。

答案 1 :(得分:1)

如果您正在为OpenGL创建轨道运行(oribitng在LookAt周围)相机,我会使用这些数据来制作它:

LookAtPosition- 3D vector
CamUp - 3D unit vector
RelativeCamPosition - 3D unit vector
CamDistance - decimal number

LookAtPosition是你要看的一个点。 CamUp是从相机指向的矢量,您可以在此image上看到它。最好在没有旋转时初始化摄像机,因此CamUp = [0,1,0]。请注意,它是单位向量,因此它的大小/大小/长度始终为1. RelativeCamPosition也是单位向量。你可以通过LookAt到相机获得它  矢量并除以它的幅度,你将在CamDistance中保存。在初始化状态下,它可能看起来像这样:

LookAtPosition = [0,0,0]
CamUp = [0,1,0]
RelativeCamPosition = [1,0,0]
CamDistance = 10

您现在可以通过

获取相机位置
CamPosition = LookAtPosition + RelativeCamPosition * CamDistance

但你需要将相机旋转到右边吗?那么有单位向量的原因 - 它们易于在计算中使用。我相信你使用角度旋转,所以你只需要使用正弦和余弦。旋转功能可能如下所示:

Rotate(angleX, angleY){
   RelativeCamPosition.x = sin(angleX)*cos(angleY);
   RelativeCamPosition.z = cos(angleX)*cos(angleY);
   RelativeCamPosition.y = sin(angleY);
}

其中angleX和angleY是水平和垂直方向上的绝对(非相对)旋转。您应该始终使用绝对roations,因为添加时可能存在浮点错误。无论如何,我只是在纸上做了那些计算,所以我希望他们没事。

编辑:我刚刚注意到,只要你的状态与我写的RelativeCamPosition = [1,0,0]一样,这就行了。然而,编辑它们应该不难,因此它适用于arbirtary初始状态。