0

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

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

4

2 回答 2

1

更新

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

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

原来的


我自己也在玩 JOGL,尽管我之前对 OpenGL 的经验有限。OpenGL 使用两个矩阵将您通过它的所有 3D 点从 3D 模型空间转换为 2D 屏幕空间,即 Projection 矩阵和 ModelView 矩阵。

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

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

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

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

JOGL-Demos 和 JOCL-Demos 中有许多演示涉及这种操作。例如,这个类被设计成一种原始相机,可以放大和缩小并围绕场景的原点旋转,但不能转动。因此,它仅表示为 3 个浮点数:X 和 Y 旋转以及 Z 距离。它将其转换应用于 Modelview,如下所示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 库尝试使用基于 Quaternion+Vector+Float 的相机,并像这样应用我的相机变换:

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 模式。

于 2012-12-27T07:19:45.973 回答
0

但我找不到关于如何设置和旋转相机的教程或解释

因为没有。OpenGL 不是场景图。它主要是复杂的画布和简单的点、线和三角形绘图工具。放置“对象”实际上意味着应用线性变换将 3 维向量放置在 2D 帧缓冲区上。

因此,您无需放置“相机”,而是以与移动相机相反的方式在整个世界(转换)中移动,从而产生相同的结果。

于 2012-05-05T10:16:03.053 回答