3

私は、常にカメラに面するように平面ジオメトリを常に調整するボリューム レンダリング プログラムを作成しています。プレーン ジオメトリは、カメラが回転するたびに回転し、シーン内の他のすべてのものに対して移動していないように見えます。(私は、カメラの視線方向を、これらの平面ジオメトリの法線ベクトルとして使用します。)

現在、カスタム回転ベクトル (「回転」) を手動で保存し、レンダリング関数で次のようにその影響を適用しています。

gl2.glRotated(rotations.y, 1.0, 0.0, 0.0);
gl2.glRotated(rotations.x, 0.0, 1.0, 0.0);

その後、回転からの値を使用して、x 軸と y 軸を中心に初期ビュー方向 (0,0,-1) を回転させることにより、ビュー方向を取得します。これは、次の方法で行われます。最終的な視線方向は 'view' に保存されます。

     public Vec3f getViewingAngle(){
        //first rotate the viewing POINT
        //then find the vector from there to the center
        Vec3f view=new Vec3f(0,0,-1);
        float newZ=0;
        float ratio=(float) (Math.PI/180);
        float vA=(float) (-1f*rotations.y*(ratio));
        float hA=(float) (-1f*rotations.x)*ratio;

        //rotate about the x axis first
        float newY=(float) (view.y*Math.cos(vA)-view.z*Math.sin(vA));
        newZ=(float) (view.y*Math.sin(vA)+view.z*Math.cos(vA));
        view=new Vec3f(view.x,newY,newZ);

        //rotate about Y axis
        float newX=(float) (view.z*Math.sin(hA)+view.x*Math.cos(hA));
        newZ=(float) (view.z*Math.cos(hA)-view.x*Math.sin(hA));
        view=new Vec3f(newX,view.y,newZ);
        view=new Vec3f(view.x*-1f,view.y*-1f,view.z*-1f);

        //return the finalized normal viewing direction
        view=Vec3f.normalized(view);
        return view;
}

現在、このプログラムを、カメラの回転がサードパーティのグラフィック ライブラリによって処理される、より大きなプロジェクトに移行しています。回転ベクトルがありません。ビュー方向ベクトルを取得する方法はありますか:

GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);

http://3dengine.org/Modelview_matrixを参照してこれを見ていますが、ビューの方向を思いつく方法がまだわかりません。それが可能かどうか、そしてそれがどのように機能するかを誰かが説明してもらえますか?

4

2 に答える 2

13

この写真 @ http://db-in.com/images/local_vectors.jpgをご覧ください。 http://db-in.com/images/local_vectors.jpg

飛行方向 (DOF) は 3 行目です。

GLfloat matrix[16]; 
glGetFloatv( GL_MODELVIEW_MATRIX, matrix );

float DOF[3];
DOF[0] = matrix[  2 ]; // x
DOF[1] = matrix[  6 ]; // y
DOF[2] = matrix[ 10 ]; // z

参照:

于 2014-11-03T23:06:28.270 に答える
1

モデルビュー マトリックスに従おうとする代わりに、ボリューム ラスタライザーのフラグメント インポスターを調整するには、必要に応じてモデルビュー マトリックスを調整する必要があります。OpenGL はシーン グラフではなく、描画システムであり、変更することができますし、変更する必要があります。

もちろん、ボリューム ラスター化をより大きなシーンに埋め込む必要がある場合は、モデルビュー マトリックスから特定の情報を抽出する必要がある場合があります。左上の 3×3 サブマトリックスには、モデルとビューの合成回転が含まれています。3 列目には、ビューを回転させた Z ベクトルが含まれます。

于 2013-03-29T10:55:02.303 に答える