OpenGL相机的相对旋转

OpenGL相机的相对旋转,opengl,matrix,rotation,Opengl,Matrix,Rotation,我目前正在努力寻找一个公式来旋转我的OpenGL“相机”(我尝试通过场景旋转来实现,但也有同样的问题)。 基本上,我的相机是在一个给定的位置,看一个给定的点(全部指示为gluLookAt),我想向上旋转相机,例如,仍然看同一点 正确的流程应该是什么? 我应该使用什么输入数据来决定移动量?2D鼠标坐标演化还是3D未投影鼠标坐标演化?诀窍在于,如果在正确的位置进行,则可以看到摄影机旋转与场景旋转相同。将相机移动到要围绕其旋转的点,然后旋转相机,然后按移动到的距离向后移动 旋转的数量取决于您的应用程序

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

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

诀窍在于,如果在正确的位置进行,则可以看到摄影机旋转与场景旋转相同。将相机移动到要围绕其旋转的点,然后旋转相机,然后按移动到的距离向后移动


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

如果您正在为openGL创建轨道(或环视)摄影机,我建议您使用以下数据:

LookAtPosition- 3D vector
CamUp - 3D unit vector
RelativeCamPosition - 3D unit vector
CamDistance - decimal number
LookAtPosition是您要查看的点。CamUp是从摄像机指向上的向量,你们可以在这上面看到。最好在不旋转的情况下初始化相机,这样CamUp=[0,1,0]。请注意,它是单位向量,因此其大小/长度始终为1。相对成分也是单位向量。你是通过看镜头才知道的 向量并除以它的大小,这将在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是水平和垂直方向上的绝对(非相对)旋转。您应该始终使用绝对值,因为添加时可能会出现浮点错误。不管怎样,我只是在一张废纸上做了这些计算,所以我希望它们是正确的


编辑:我刚刚注意到,如果您的初始状态与我编写的
relativecomposition=[1,0,0]
类似,那么这将起作用。不过,编辑它们应该不难,这样就可以在任意初始状态下工作。

谢谢,不过假设我在中间,我的相机本身并不是针对3个维度中的一个,而是针对其中的3个维度,所以有一点x、一点y和一点z。那么,我应该应用什么公式来向前旋转它呢?谢谢“向前旋转”我想你的意思是“向下俯仰”,就像把相机的前端往下推一样。为此,您将使用glRotate(0.1,1,0,0)。您是说要围绕其注视点旋转相机位置吗?