1

glRotatefを使用して、.obj 3d モデルを独自の軸を中心に回転させようとしています。しかし、それは私が望むように機能していません。

コード

public void onDrawFrame(GL10 gl) {

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        gl.glEnable(GL10.GL_LIGHTING);
        gl.glLoadIdentity();

        gl.glTranslatef(0f, -1.2f, -z);
        gl.glRotatef(xrot, 1f, 0f, 0f);
        gl.glRotatef(yrot, 0f, 1f, 0f);

        model.draw(gl);
    }

問題

最初の回転yrotは非常にうまく機能します。モデルの位置に関係なく、モデルは常に独自のzを中心に回転します (まあ、 yを中心に回転するように頼んだので、完璧ではありません。しかし、少なくとも独自の軸の 1 つを使用します!)

「xrot」を要求すると、x 画面軸を中心に回転します。独自のxではありません。誰かが理由を知っていますか?

備考

  • onDrawFrameが常に実行されていることに気付きました。ただし、モデルは常に1.2fyを変換しているわけではありません。z != 0 の場合のみ (理由はわかりません)。
  • 三角法を使用して正しいxベクトルを取得できることを読みました。しかし、これは私には意味がありません。アプリがモデルの位置をメモリに保持して yrot を正しくすることができる場合、 xrotに対して同じことができないのはなぜですか?
4

2 に答える 2

1

操作の順序が重要です。一連の行列乗算の変換 (すべての OpenGL 変換呼び出しは実際には単なる行列乗算です) は「逆」に動作します。つまり、変換行列に乗算された最後の変換が最初に適用されます。そして、各変換は「ローカル」オリジンに作用します。

最初の変換は、y 軸を中心とした回転です。次に、x 軸の回転が適用されますが、これは新しいローカル座標系で発生します。

「xrot」を要求すると、x 画面軸を中心に回転します。独自の x ではありません。誰かが理由を知っていますか?

特定の変換チェーンでは、x 軸の回転がたまたま画面の x 軸と一致します。

onDrawFrame が常に実行されていることに気付きました。ただし、モデルは常に y を 1.2f だけ移動しているわけではありません。

OpenGL はシーン グラフではありません。モデルが何であるかさえ「知りません」。一度に 1 つずつ、単一の点、線、および三角形を描画するだけです。シーンで何かが変わると、すべてを再描画する必要があります。関数glRotateなどはglTranslate、モデルには作用しません。それらが行うことは、現在アクティブな変換マトリックスの値を操作することだけです。そして、最終的に何かを描画すると、着信頂点ベクトルを変換するために使用されるのはこのマトリックスだけです (位置だけでなく、固定関数の他の属性のマトリックスもあり、シェーダーを使用するとすべてが可能になります)。とにかく、新しいフレームの描画を開始するときは、行列を既知の状態にリセットする必要があります。それglLoadIdentityがそうです。したがって、すべてのフレームが新たに開始されます。

z != 0 の場合のみ (理由はわかりません)。

おそらく、 の値は、z反復ごとにコード内の別の場所にある他の変数に統合されます。

于 2016-05-04T09:15:08.720 に答える