OpenGL旋转相机

时间:2012-12-27 20:19:06

标签: java opengl camera

如何用鼠标旋转相机(播放器)?在几乎任何3D游戏中,您都可以使用鼠标环顾世界。我可以使用glRotatef()来完成此任务吗?或者是否有一个特定的函数用于旋转视口?

4 个答案:

答案 0 :(得分:0)

您必须使用鼠标坐标来计算您必须旋转的方向。

例如:如果您每帧都存储鼠标坐标,则可以执行以下操作:

if (thisFrameMouse.x >= lastFrameMouse.x) {
  // mouse moved to right
} else {
  // mouse moved to left
}

然后,您可以使用此信息根据两个值的差异计算新的旋转角度。使用旋转角度和旋转轴,您可以创建新的旋转矩阵或使用glRotatef更新现有矩阵(使用矩阵模式GL_MODELVIEW,这要归功于datenwolf)。

如果您使用的是GLU,还可以使用gluLookAt功能

答案 1 :(得分:0)

这取决于你想拥有的那种观点。 你可以使用glOrtho():这里物体的深度无关紧要,物体被投射到屏幕上的屏幕上。在Google图片上搜索glOrtho()时,您可以看到一些带图片的示例。 你也可以使用glLookAt():这是人类的观点。如何进一步了解它们的可见度。

对于glOrtho(),您必须使用glRotated并使用鼠标正确连接。 使用glLookAt稍微困难一些。在这里,您必须使用一些数学来计算要查看的点。 灯塔的教程很好。

请记住,您必须再次计算相机的每一帧。因为鼠标移动了。

答案 2 :(得分:0)

首先你必须明白,在OpenGL上没有相机!

OpenGL的作用是,它采用顶点位置并通过一系列线性变换(在固定函数管道中)。

通常的管道是

将顶点局部空间位置放入眼睛空间位置(模型视图转换)

v_eye = M · v

从那里进入剪辑空间(投影变换)

v_clip = P · v_eye

然后进入规范化设备坐标(NDC)空间

v_ndc = v_clip / v_clip.w

就是这样。没有相机。那么如何定义视口呢?好好想一想:在世界上移动相机,或者将相机保持在原位并移动整个世界,视觉效果没有区别。所以神奇必定发生在眼睛空间的转换中(即视图中顶点的位置)。

为此,我们将模型视图矩阵M分解为模型到世界的部分(W)和移动世界到视图

M = V · W

所以这个矩阵V定义了“相机”。让我们假设世界上有一个摄像机对象,由摄像机到世界的变换C定义,变换到眼睛空间后摄像机对象位置的位置应保持不变,即身份

1 = V · C

因此

C = V^-1

即。视图变换是将相机从原点放入世界的变换的反转。


那么哪个OpenGL函数确定了视图呢?没有特别的。固定功能OpenGL使用多个矩阵。固定函数OpenGL提供原始矩阵操作方法,glScale,glTranslate,glRotate,可用于创建复合矩阵。从这里你就是你自己,因为你必须弄明白自己,如何根据你想要处理的用户输入实现相机变换。

答案 3 :(得分:0)

是的,您可以使用glRotatef(),但您需要计算旋转的数量以及旋转的位置。