OpenGL相机的相对旋转

Posted

技术标签:

【中文标题】OpenGL相机的相对旋转【英文标题】:Relative rotation of OpenGL Camera 【发布时间】:2011-07-27 12:51:22 【问题描述】:

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

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

【问题讨论】:

你是说你想旋转你的相机位置围绕它的观察点? 【参考方案1】:

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

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

【讨论】:

谢谢,但是假设我在中心,我的相机本身并不是只针对 3 个维度中的一个,而是针对其中 3 个维度,所以有点 x,有点 y还有一点z。那么我应该应用什么公式来向前旋转它?谢谢! “向前旋转”我认为您的意思是“向下俯仰”,例如将相机的前端向下推。为此,您将使用 glRotate(0.1, 1, 0, 0)。【参考方案2】:

如果您正在为 openGL 创建轨道(围绕 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 是水平和垂直方向的绝对(非相对)旋转。您应该始终使用绝对旋转,因为添加时可能会出现浮点错误。不管怎样,我只是在一张纸上做了这些计算,所以我希望它们没事。

编辑:我刚刚注意到,只要您的初始状态就像我写的RelativeCamPosition = [1,0,0],这将起作用。但是,编辑它们应该不难,因此它适用于任意初始状态。

【讨论】:

以上是关于OpenGL相机的相对旋转的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL中沿对象后面的方向旋转相机

Java OpenGL - 如何使对象随相机旋转?

使用 OpenGL 2.0 API 在 GLSurfaceView 上将 Android 相机预览旋转 90 度

OpenGL在2个键上旋转相机

从相机旋转中隔离“指南针”openGL

OpenGL:相机和对象