2

3D空間を移動するカメラを作成しようとしていますが、セットアップに問題があります。私はこれをJavaで行っていますが、gluPerspectiveとgluLookAtを一緒に使用すると、競合が発生するようです(画面が狂ったようにちらつき始めます)。

gluPerspectiveは次のように設定されます。

gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(50.0f, h, 1.0, 1000.0);
gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);

次に、目の座標、前方および上方のベクトル( http://people.freedesktop.org/~idr/glu3/form_4.png )を使用してカメラマトリックスを作成します(カメラのコードが正しいと仮定します。

最後に、私が持っているものを描く前に:

gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glMultMatrixf(camera.matrix);

次に、描画ルーチンを呼び出します(glRotatefおよびglTranslatefを呼び出すことにより、独自に変換/回転を実行します)。

glMultMatrixfを呼び出さないと、カメラは画面の中央に表示する必要のあるアイテムを表示します。ただし、glMulMatrixfを使用すると、画面が真っ暗になります。代わりにglLoadMatrixfを使用してみましたが、どちらも機能しませんでした。私は何か間違ったことをしていますか?私は何かを場違いにしていますか?そうでない場合、これはそれがどのように行われるべきかを私に知らせてください、そして私は衝突を引き起こしているかもしれないカメラコードのいくつかを投稿します。

編集:これがカメラマトリックス作成コードです:

private void createMatrix()
{
    float[] f = new float[3]; //forward (centre-eye)
    float[] s = new float[3]; //side (f x up)
    float[] u = new float[3]; //'new up' (s x f)        
    for(int i=0;i<3;i++){
        f[i] = centre[i]-eye[i];
    }
    f = Maths.normalize(f);
    s = Maths.crossProduct(f,upVec);
    u = Maths.crossProduct(s,f);

    float[][] mtx = new float[4][4];
    float[][] mtx2 = new float[4][4];   
            //initializing matrices to all 0s   
    for (int i = 0; i < mtx.length; i++) {
        for (int j = 0; j < mtx[0].length; j++) {
            mtx[i][j] = 0;
            mtx2[i][j] = 0;
        }
    }

            //mtx =  [ [s] 0,[u] 0,[-f] 0, 0 0 0 1]
            //mtx2 = [1 0 0 -eye(x), 0 1 0 -eye(y), 0 0 1 -eye(z), 0 0 0 1]
    for(int i=0;i<3;i++){
        mtx[0][i] = s[i];
        mtx[1][i] = u[i];
        mtx[2][i] = -f[i];

        mtx2[i][3]=-eye[i];
        mtx2[i][3]=-eye[i];
        mtx2[i][3]=-eye[i];
    }
    mtx[3][3] = 1;
    mtx2[0][0]=1;mtx2[1][1] = 1;mtx2[2][2] = 1;mtx2[3][3] = 1;

    mtx = Maths.matrixMultiply(mtx,mtx2);
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
                            // this.mtx is a float[16] for glMultMatrixf
            this.mtx[i*4+j] = mtx[i][j];
        }
    }

}

エラーがこのコードのどこかにあると思っています。そうでない場合は、数学関数を見て何が起こっているのかを確認します。

EDIT2:少なくとも最初のベクトル(eye、centre、up)は正しく、カメラを本来あるべき場所に配置します(gluLookAtで動作しましたが、ちらつきの問題がありました)。

4

2 に答える 2

5

glRotatef、glTranslatef、および glFrustum を使用してカメラを作成する方が簡単かもしれませんが、数学は私には問題ないようです (UpVec が実際に定義されている限り)。私が行ったほとんどの 3D グラフィックスでは、追跡したいオブジェクトが定義されていませんでした。最終的にこれに落ち着く前に、gluLookAt を使用して 3D カメラのさまざまな実装を行いました。

私がカメラを定義する方法は次のとおりです。

カメラを作成または初期化するとき、glFrustum で射影行列を設定します。必要に応じて glPerspecive を使用できます。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left, right, down, up, near, far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

レンダー パスのカラー バッファと深度バッファをクリアした後、

glLoadIdentity();
glRotated(orientation.x, 1.0, 0.0, 0.0);
glRotated(orientation.y, 0.0, 1.0, 0.0);
glRotated(orientation.z, 0.0, 0.0, 1.0);
glTranslatef(position.x, position.y, position.z);

カメラの位置と方向を合わせます。最初に、位置と方向の両方を {0} に設定し、キーが押されたときに位置に加算または減算し、マウスが移動したときに orientation.x および orientation.y に加算または減算します... (私は通常、 tはorientation.zを台無しにします)

乾杯。

于 2010-11-28T03:27:17.180 に答える
1

ある種修正しました。問題は、glMultMatrix(float [] matrix、int?ofset?)...を使用していたことです。何らかの理由で、glMultMatrix(FloatBuffer matrix)を使用するだけで、正常に動作します。

私が行っている変換にはいくつかの問題がありますが、それらに対処できるはずです...皆さんからのご意見ありがとうございます。

于 2010-11-28T05:37:02.230 に答える