0

最近JOGLを使い始めました。キャンバス上にオブジェクトを作成および描画する方法は知っていますが、カメラの設定および回転方法に関するチュートリアルまたは説明が見つかりませんでした。ソースコードしか見つけられませんでしたが、これはまったく初めてなので、あまり役に立ちません。

開始するのに適したチュートリアルまたは場所を知っている人はいますか? 私はグーグルで検索しましたが、何も見つかりませんでした (JOGL 1.5 のみで、2.0 を使用しています)。

4

2 に答える 2

1

アップデート

datenwolf が指摘しているように、私の説明は、置き換えられた OpenGL 2 パイプラインに関連しています。これは、廃止されたメソッドを避けたい場合は、ワールド空間からスクリーン空間への独自の操作を行う必要があることを意味します。悲しいことに、この小さな脚注は、OpenGL のサンプル コードや宇宙の解説のすべてにまだ添付されていません。

もちろん、既存の GL2 パイプラインを使用して同じことを行うライブラリを選択したり、自分でライブラリを構築したりすることが必ずしも悪いことである理由はわかりません。

オリジナル


OpenGLの経験は限られていますが、私は自分でJOGLをいじっています。OpenGL は、通過するすべての 3D ポイントを 3D モデル空間から 2D 画面空間に変換するために、Projection マトリックスと ModelView マトリックスの 2 つのマトリックスを使用します。

射影行列は、3D 世界と 2D 画面の間の変換を補正するように設計されており、高次元空間を低次元空間に投影します。gluPerspectiveその行列を設定するための glut ツールキットの関数である グーグル で、さらに多くの詳細を取得できます。

一方、 ModelView 1マトリックスは、3D 座標アイテムをシーン空間からビュー (またはカメラ) 空間に変換する役割を果たします。これがどのように正確に行われるかは、カメラをどのように表現しているかによって異なります。カメラを表す 3 つの一般的な方法は次のとおりです。

  • 位置のベクトル、カメラのターゲットのベクトル、および「上」方向のベクトル
  • 位置のベクトルと向きのクォータニオン (およびおそらくスケール用の単一の浮動小数点値、またはスケールを 1 に設定したままにする)
  • 位置、方向、およびスケールを含む単一の 4x4 行列

どちらを使用する場合でも、表現を OpenGL メソッドに渡して ModelView マトリックスを設定できるものに変換するためのコードを作成する必要があります。また、ユーザー アクションをカメラ データの変更に変換するコードを作成する必要があります。

JOGL-Demos と JOCL-Demos には、この種の操作を含む多数のデモがあります。たとえば、このクラスは一種のプリミティブ カメラとして機能するように設計されており、ズームインおよびズームアウトし、シーンの原点を中心に回転できますが、それ以外の場合は回転できません。したがって、これは 3 つの float のみで表されます: 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: View マトリックスだけでなく ModelView と呼ばれる理由は、ModelView スタックで実際にマトリックスをプッシュおよびポップできるためです (これは、私が信じているすべての OpenGL 変換マトリックスに当てはまります)。通常、シーン グラフ内の相互に関連するアイテムのさまざまな変換を表すマトリックスの完全なスタックを持ち、一番下のマトリックスがカメラ変換を表すか、単一のカメラ変換を持ち、シーン グラフ内のすべてをワールド空間座標に保持します。 (これは、シーングラフを持つという点を無効にしますが、何でも)。

gl.glMatrixMode(GL2.GL_MODELVIEW);2: 実際には、射影行列をアクティブに設定しない限り、GL ステート マシンは常に MODELVIEW モードのままであるため、コード内でへの呼び出しは表示されません。

于 2012-12-27T07:19:45.973 に答える
0

しかし、カメラを設定して回転させる方法に関するチュートリアルや説明が見つかりませんでした

ないからです。OpenGL はシーン グラフではありません。ほとんどが洗練されたキャンバスで、シンプルな点、線、三角形の描画ツールです。「オブジェクト」を配置するということは、実際には線形変換を適用して 3 次元ベクトルを 2D フレームバッファに配置することを意味します。

したがって、「カメラ」を配置する代わりに、カメラを移動するのとは逆の方法で全世界を移動 (変換) するだけで、まったく同じ結果が得られます。

于 2012-05-05T10:16:03.053 に答える