gpt4 book ai didi

Java OpenGL 相机

转载 作者:行者123 更新时间:2023-12-01 15:23:56 31 4
gpt4 key购买 nike

我最近开始使用 JOGL,我知道如何在 Canvas 上创建和绘制对象,但我找不到有关如何设置和旋转相机的教程或说明。我只找到了源代码,但由于我对此很陌生,所以它没有太大帮助。

有人知道一个好的教程或从哪里开始吗?我用谷歌搜索但找不到任何东西(仅适用于 JOGL 1.5,我使用的是 2.0)。

最佳答案

更新

正如 datenwolf 指出的那样,我的解释与 OpenGL 2 管道相关,该管道已被取代。这意味着如果您想避免使用已弃用的方法,则必须自己从世界空间到屏幕空间进行操作。遗憾的是,这个小脚注还没有被附加到 OpenGL 示例代码的最后一点或宇宙中的评论中。

当然,我不知道为什么在选择一个库来做同样的事情或自己构建一个库之前使用现有的 GL2 管道一定是一件坏事。

原件

<小时/>

我自己正在尝试 JOGL,尽管我之前对 OpenGL 的经验有限。 OpenGL 使用两个矩阵将您通过它的所有 3D 点从 3D 模型空间转换到 2D 屏幕空间,即投影矩阵和模型 View 矩阵。

投影矩阵旨在补偿 3D 世界和 2D 屏幕之间的平移,将较高维空间投影到较低维空间。您可以通过谷歌搜索 gluPerspective 获得更多详细信息,这是 glut 工具包中用于设置该矩阵的函数。

另一方面,ModelView1 矩阵负责将 3D 坐标项从场景空间转换到 View (或相机)空间。具体如何完成取决于您如何表示相机。表示相机的三种常见方式是

  • 位置 vector 、相机目标 vector 和“向上”方向 vector
  • 表示位置的 vector 加上表示方向的四元数(可能还加上表示比例的单个浮点值,或者将比例设置为 1)
  • 包含位置、方向和比例的单个 4x4 矩阵

无论您使用哪一种,都需要编写代码将表示形式转换为可以提供给 OpenGL 方法以设置 ModelView 矩阵的内容,并编写代码将用户操作转换为对相机数据的修改。

JOGL-Demos 和 JOCL-Demos 中有许多涉及此类操作的演示。例如,this class被设计为一种原始相机,可以放大和缩小并绕场景原点旋转,但不能以其他方式旋转。因此,它仅表示为 3 个浮点:X 和 Y 旋转以及 Z 距离。它将其转换应用于模型 View ,如下所示2:

gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslatef(0, 0, z);
gl.glRotatef(rotx, 1f, 0f, 0f);
gl.glRotatef(roty, 0f, 1.0f, 0f);

我目前正在使用 Java Vecmath 库尝试基于四元数+ vector +浮点的相机,并且我像这样应用相机变换:

Quat4d orientation;
Vector3d position;
double scale;
...
public void applyMatrix(GL2 gl) {
Matrix4d matrix = new Matrix4d(orientation, position, scale);
double[] glmatrix = new double[] {
matrix.m00, matrix.m10, matrix.m20, matrix.m30,
matrix.m01, matrix.m11, matrix.m21, matrix.m31,
matrix.m02, matrix.m12, matrix.m22, matrix.m32,
matrix.m03, matrix.m13, matrix.m23, matrix.m33,
};
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadMatrixd(glmatrix, 0);
}

1:它之所以被称为 ModelView 而不仅仅是 View 矩阵,是因为您实际上可以在 ModelView 堆栈上推送和弹出矩阵(我相信所有 OpenGL 变换矩阵都是如此)。通常,您要么拥有一整堆矩阵,表示场景图中项目相对于彼此的各种变换,底部矩阵表示相机变换,要么您拥有单个相机变换并将场景图中的所有内容保留在世界空间坐标中(这违背了场景图的意义,但无论如何)。

2:实际上,您不会在代码中看到对 gl.glMatrixMode(GL2.GL_MODELVIEW); 的调用,因为 GL 状态机始终处于 MODELVIEW 模式,除非您正在主动设置投影矩阵。

关于Java OpenGL 相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10460721/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com