我目前正在努力寻找一个公式来旋转我的OpenGL“相机”(我试图通过场景旋转做它,但有相同的问题)。 基本上我的相机是在一个给定的位置,看一个给定的点(全部显示为gluLookAt),我想向上旋转相机,例如,仍然看着相同的点。OpenGL相机的相对旋转
什么应该是正确的过程? 我应该用什么输入数据来决定移动量? 2D鼠标坐标演变还是3D未投影鼠标坐标演变?
我目前正在努力寻找一个公式来旋转我的OpenGL“相机”(我试图通过场景旋转做它,但有相同的问题)。 基本上我的相机是在一个给定的位置,看一个给定的点(全部显示为gluLookAt),我想向上旋转相机,例如,仍然看着相同的点。OpenGL相机的相对旋转
什么应该是正确的过程? 我应该用什么输入数据来决定移动量? 2D鼠标坐标演变还是3D未投影鼠标坐标演变?
诀窍是看到相机旋转与场景旋转相同,如果您在正确的位置进行旋转。将相机移动到要围绕其旋转的的点,然后旋转相机,然后移回距离相同的距离。
您旋转的量取决于您的应用程序。以G-Earth为例:如果你靠近表面,旋转是(绝对)小的,如果你距离表面很远则旋转很大。
谢谢,不过,假设我处于中心位置,我的相机本身并不是针对3个维度中的一个,而是针对其中的3个维度,因此有点x,y和z位。那么我应该使用什么公式来转发它呢?谢谢 ! –
通过“向前旋转”,我认为你的意思是“向下倾斜”,就像推下相机的前端。为此,你可以使用glRotate(0.1,1,0,0)。 –
如果要创建轨道(大约注视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]
一样。但编辑它们不应该很难,因此它适用于初始状态。
你是说你想旋转你的相机位置_around_它的视点? –