Java OpenGL旋转摄像机

Java OpenGL旋转摄像机,java,opengl,camera,Java,Opengl,Camera,如何用鼠标旋转相机(播放器)?在几乎任何3D游戏中,你都可以用鼠标环视世界。我可以用glRotatef()来完成这个任务吗?或者是否有一个特定的函数可以用来旋转视口?您必须使用鼠标坐标来计算旋转方向 例如:如果每帧存储鼠标坐标,则可以执行以下操作: if (thisFrameMouse.x >= lastFrameMouse.x) { // mouse moved to right } else { // mouse moved to left } 然后可以使用此信息根据两个值的

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

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

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

if (thisFrameMouse.x >= lastFrameMouse.x) {
  // mouse moved to right
} else {
  // mouse moved to left
}
然后可以使用此信息根据两个值的差值计算新的旋转角度。使用旋转角度和旋转轴,您可以创建新的旋转矩阵或使用
glRotatef
更新现有矩阵(使用矩阵模式
GL\u MODELVIEW
,多亏了datenwolf)


如果您使用的是GLU,您还可以使用函数

,该函数取决于您想要的视图类型。 您可以使用glOrtho():在这里,对象的深度无关紧要,对象在屏幕上平行投影到屏幕上。在谷歌图像上搜索glOrtho()时,可以看到一些图像示例。 您还可以使用glLookAt():这是人类的视图。物体越远,它们的可见度就越低

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


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

首先,您必须了解OpenGL上没有摄像头

OpenGL所做的是,它获取顶点位置并将它们通过一系列线性变换(在固定函数管道中)

通常的管道是

顶点局部空间位置到眼睛空间位置(modelview变换)

从那里它进入clipspace(投影变换)

然后进入归一化设备坐标(NDC)空间

就这样。没有照相机。那么如何定义视口呢?我们可以这样想:在世界上移动摄像机,或者保持摄像机的位置并移动整个世界,在视觉效果上没有区别。因此,魔法必须发生在眼睛空间的变换中的某个地方(即视图中顶点的位置)

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

M = V · W
所以这个矩阵V就是“摄像机”的定义。假设世界上有一个摄影机对象,由摄影机到世界变换C定义,摄影机对象位置在变换到视线空间后的位置应保持不变,即标识

1 = V · C
因此

C = V^-1
i、 e.视图变换是将摄影机从原点放置到世界的变换的逆变换



那么,哪个OpenGL函数定义了视图呢?没什么特别的。固定函数OpenGL使用许多矩阵。固定函数OpenGL提供了原始矩阵操作方法glScale、glTranslate、glRotate,可用于创建复合矩阵。从这里开始,您就要自己动手了,因为您必须自己弄清楚,如何根据您想要处理的用户输入来实现相机转换。

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

您将Java作为标记之一。我想这意味着您使用的是LWJGL还是JOGL?不管是哪种方式,请看。如果你正在使用JOGL,这是一个LWJGL教程,但是你应该能够理解这里发生的事情并从中学习。我理解这一部分,但是我实际上如何旋转相机?我是否只使用
glRotatef
?或者旋转相机有什么特别的功能?@micha:这真是个糟糕的建议!投影矩阵不是用来定位视点的!投影矩阵仅用于定义虚拟相机的“镜头”。你是对的,我删除了注释并将其编辑到答案中。我已经很久没有使用FFP了:-(这很有用!但是我使用
GLU.glupperspective(45.0f,Display.getWidth()/Display.getHeight(),1.0f,100.0f)
要设置我的视图端口,这是错误的吗?我看过的每个教程都使用它…嗨,gluperspective设置了最小和最大视图距离,这样就不会显示超过最大值的对象。这可以与glLookAt一起使用。这一切都是有意义的,我以前知道大部分。我也知道OpenGL中没有真正的相机,但我只是在看我不知道如何开始一门基本的相机课程。我不知道怎么做,在过去的一周里,我一直在疯狂地研究和搜索东西。你能给我一些关于如何进行旋转的提示吗?@opiop65:这样想一下:你的相机可以被认为是一个矩阵,它首先放在modelview矩阵堆栈上。我不会n为OpenGL固定函数矩阵操作方法(glRotate等)而烦恼;它们已从最新版本的OpenGL中完全删除,过去也没有人在严肃的程序中使用它们。相反,您应该使用一些矩阵数学库来构建相机矩阵,然后将其加载到堆栈(glLoadMatrix)中然后再考虑如何在世界上移动一个真实的相机,并将其模拟为一系列变换。要将此视图作为相机矩阵(而不是对象矩阵),只需反转生成的复合矩阵即可。@opiop65:作为矩阵数学库,我推荐Eigen、GLM或(自我广告)linmath.h——谷歌发现了它们,超链接在评论中效果不佳。
M = V · W
1 = V · C
C = V^-1