1

私は簡単なことを達成しようとしています.X軸に平行移動を設定し、オブジェクトをその中心を中心に固定角度で回転させます。

これを達成するには、私の現在の知識では、オブジェクトを中心に移動し、回転させ、元の位置に戻す必要があります。わかった。私が得る問題は、オブジェクトがローカル軸を回転させ、これらの軸に沿って最後の移動を行うように見えるため、間違った位置で終わることです。

これは私のコードです:

public void draw(GL10 gl) {
    gl.glLoadIdentity();

    GLU.gluLookAt(gl, 0, 0, 5, 0, 0, 0, 0, 1, 0);

    gl.glTranslatef(x, 0, 0);

    gl.glTranslatef(-x, 0, 0);
    gl.glRotatef(-80, 0, 1, 0);
    gl.glTranslatef(x, 0, 0);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glFrontFace(GL10.GL_CW);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    gl.glDrawElements(GLES20.GL_TRIANGLES, indices.length,  GLES10.GL_UNSIGNED_SHORT, indicesBuffer);
}

回転する前に、オブジェクトは 0,0,0 にある必要があります。正しく回転します。しかし、x 軸が私 (80°) を指しているかのように画面に近づきます。

注: これは一般的な OpenGL の質問であるため、タグとして「opengl」のみを許可します。答えは Android 関連ではありません。

4

1 に答える 1

4

これは非推奨の方法ですが、質問に答えない言い訳にはならないと思います。

複数の変換が頂点に適用される場合、OpenGL は行列の乗算を逆の順序で実行します。たとえば、頂点が最初に MA で変換され、次に MB で変換される場合、OpenGL は最初に MB x MA を実行してから頂点を乗算します。したがって、最後の変換が最初に行われ、最初の変換はコード内で最後に行われます。

gl.glPushMatrix();

gl.glTranslatef(globalX, 0, 0);

gl.glTranslatef(localX, 0 ,0);
gl.glRotatef(-80, 0, 1, 0);

gl.glTranslatef(-globalX, 0, 0);

gl.glPopMatrix();

最初に、トランスフォームの階層内にある場所から原点に移動します。次に、その原点を中心に回転します。任意の軸に沿って局所的な動きを適用します。オブジェクトをグローバル位置に戻します。

glPushMatrix() と glPopMatrix() を使用して、同じレベルの相対位置にある要素の変更を元に戻します。これは、相対位置が同じ親要素を持つことです。プッシュは、上記のローカル コードでの操作の後に OpenGL が適用する以前の (親) オブジェクトからの変換を保持します。これは、共通スタック (LIFO) (この場合はマトリックス スタック) の順序であるためです。

于 2013-01-17T09:13:39.630 に答える