2011-07-27 71 views
1

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

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

+0

你是说你想旋转你的相机位置_around_它的视点? –

回答

2

诀窍是看到相机旋转与场景旋转相同,如果您在正确的位置进行旋转。将相机移动到要围绕其旋转的的点,然后旋转相机,然后移回距离相同的距离。

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

+0

谢谢,不过,假设我处于中心位置,我的相机本身并不是针对3个维度中的一个,而是针对其中的3个维度,因此有点x,y和z位。那么我应该使用什么公式来转发它呢?谢谢 ! –

+0

通过“向前旋转”,我认为你的意思是“向下倾斜”,就像推下相机的前端。为此,你可以使用glRotate(0.1,1,0,0)。 –

1

如果要创建轨道(大约注视oribitng)相机的OpenGL我sugest你使用这些数据使其:

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中。在intialized状态时,它看起来就象这样:

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是绝对的(而不是相对)的旋转在水平和垂直方向。您应该始终使用绝对旋转,因为在添加时可能会出现浮点错误。无论如何,我只是在纸上做了这些计算,所以我希望它们是好的。

编辑:我刚刚注意到,如果你的最初状态就像我写的RelativeCamPosition = [1,0,0]一样。但编辑它们不应该很难,因此它适用于初始状态。