0

次のコードがあります。

    void setupCamera() {

    // Clear the screen buffer
    glClear(GL_COLOR_BUFFER_BIT);

    // reset the projection matrix //
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    // and set the perspective with the current field of view,
    // and the current height and width
    gluPerspective(fov, ratio, objDepth - objRadius * 2,
            objDepth + objRadius * 2);
    glViewport(0, 0, WINDOW_SIZE, WINDOW_SIZE);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    if(first){
        glMultMatrixf(rotMatrix);

    }
    first = true;

    //translate everything to be in objDepth//
    glTranslatef(initX * 0.01, initY * 0.01, (-1) * objDepth);

    glRotatef(200 * angle, rotationVector[0], rotationVector[1],
            rotationVector[2]);

    glutWireTeapot(1.5);


    glGetFloatv (GL_MODELVIEW_MATRIX, rotMatrix);


    }

回転ベクトルは回転軸を保持し、

translate は、すべてを正しい位置に移動するために使用されます。

glMultMatrixf問題は、最後に保存したマトリックスを使用するために使用していることです。

回転してから平行移動し、 で行列を再度保存しglGetFloatvます。

この関数はタイマーで常に呼び出されますが、何らかの理由で

わかりません。マトリックスは何も保存せず、常に何度も初期化されます。

つまり、回転は常に小さな角度で使用されます (行列が保存されないため)。

保存された行列は、コード内の他の場所では使用されていません。

何か案は?

4

1 に答える 1

0

ティックごとに setupCamera() を呼び出していますか? もしそうなら、やめた方がいいかもしれません。フレームごとに射影マトリックスをリセットする必要はありません。必要でない限り、モデル ビュー マトリックスもリセットする必要はありません。行列全体を格納するのではなく、角度と平行移動を単独でインクリメントすることを検討してください。

必要な手順は次のとおりです。

1) 初期行列。アイデンティティへの射影を初期化し、gluPerspective を使用します。次に、modelview に切り替えて、同様に ID に初期化します。これは実際には一度だけ行う必要があります。

2) 更新ループで、代表変数の角度と平行移動をインクリメントします。

3) 描画ループで、glPushMatrix() を使用してモデルビュー マトリックスをプッシュします。gltranslate と glrotate を使用してマトリックスの変更を適用し、描画しているものを何でも描画します。その後、アイデンティティに戻るために glPopMatrix() を実行します。

何かを描画しようとしていて、フレームごとに現在の glMatrix を読み取って保存し、復元する必要があると考えているのか、それとも実際に OpenGL がマトリックスに対して行うことを評価しようとしていて、実際に読み取る必要があるのか​​ どうかはまだよくわかりません。それを出します。

于 2012-11-25T00:25:39.637 に答える