2

最近完成したopenglプログラムに「カメラ」があります。ただし、回転してから再び移動すると、x、y、z の角度が変わることに気付きました。たとえば、「w」キーを押すと、「z」軸に沿って前進します。次に、カメラを 90 度回転させて「W」キーを押すと、実際には「x」軸に沿って右に移動します。なぜこうなったのかは理解できますが、なぜこうなったのか気になります。回転関数は次のとおりです。

private void camera() {
    glRotatef(xrot, 1.0f, 0.0f, 0.0f);
    glRotatef(yrot, 0.0f, 1.0f, 0.0f);
}

キーボード機能:

if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
        xpos -= 0.035 * delta;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
        xpos += 0.035 * delta;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
        zpos += 0.03f * delta;
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
        zpos -= 0.035 * delta;
    }
if (Keyboard.isKeyDown(Keyboard.KEY_UP)) {
        xrot += 0.035;
        if (xrot > 360) {
            xrot -= 360;
        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)) {
        xrot -= 0.035;
        if (xrot > 360) {
            xrot += 360;
        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT)) {
        yrot += 0.035;
        if (xrot > 360) {
            xrot -= 360;
        }
    }

    if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {
        yrot -= 0.035;
        if (xrot > 360) {
            xrot += 360;
        }

    }

そして私の翻訳機能:

        glTranslated(xpos, ypos, zpos - 30);

これを解決する方法についてのアイデアはありますか?

4

2 に答える 2

2

おそらく、カメラが指している場所を参照して移動することを期待しています。これは、該当する場合、x、y、z 位置の両方にデルタを追加することを意味します。

幸いなことに、オイラー角 (xrot、yrot) からカメラの viewMatrix を計算すると、回転行列には追加する値が正確に含まれます。

 [rx ux fx - ]
 [ry uy fy - ] = viewMatrix
 [rz uz fz - ]
 [ - -  -  - ]

「-」でマークされた要素を無視して、右/左に移動する場合は「右」の列ベクトル = (rx,ry,rz) を加算/減算する必要があり、上に移動する場合は「上」のベクトル = (ux,uy,uz) を加算/減算する必要があります。 /down と front ベクトル (fx,fy,fz) は、前後に移動します。

高度が変わらない場合は、ry、uy、fy コンポーネントを無視し、残りの 2 つのコンポーネントを正規化する準備をします。

于 2012-12-29T06:24:26.153 に答える
0

おそらく古いgluLookAtに基づいてカメラを見ると、カメラの位置とそれが指している場所をより適切に制御できます。

ここにいくつかのリンクがあります:

于 2012-12-29T10:02:04.297 に答える