我目前正在努力寻找旋转我的OpenGL“相机”的公式(我尝试通过场景旋转来做,但也有同样的问题)。 基本上我的相机位于一个给定的位置,看着一个给定的点(所有指示到gluLookAt),我想向上旋转相机,例如,仍然看着同一点。
什么是正确的过程? 我应该用什么输入数据来决定运动量? 2D鼠标坐标演化或3D未投影鼠标坐标演变?
答案 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初始状态。