2016-06-20 12 views
0

glRotateFに問題があります。問題は次のとおりです。glRotatefが中心に戻る

デカルト座標系を表す3本の線は、カメラの視点を表しています。

このカメラは、その視点を回転させることができます。回転すると、回転した角度と軸のメッセージが送信されます。

私のアプリは、このメッセージを取得し、メソッドに送信し、この方法は、回転させた軸とその角度を取得し、このメソッドに送信します:

これまでのところ、すべてが働いている、問題はこの後に開始されます。

どの角度でも角度と角度Zで角度Xを回転するようにメッセージを送信すると、z軸だけ回転します。

デバッグでは、最初にX角度を与えられた角度で回転させたことに気付きましたが、角度でZを回転させると元の位置に戻ってからZを回転してXの回転を失います。この例のように :

初期位置:90°で

Normal Coordinate System

ローテートX:90°で

Rotate 90 on X

ローテートZ(あるべき姿):

Rotate 90 on Z right

90°の回転のZ(実際に何が起こっている):

Wrong Z rotate

私が欲しいものは、xを回転させ、その後、失うのx回転せずにZです。

これは私が軸を回転させるために呼び出す方法です:

openGl.rotateX((float) x); 
openGl.rotateZ((float) z); 

方法回転Xおよび回転Z

public void rotateX(float grau) { 
    mCubeRotation = grau; 
    eixoX = 1.0f; 
    eixoY = 0.0f; 
    eixoZ = 0.0f; 
    surfaceView.requestRender(); // line to call onDrawFrame 
} 

public void rotateZ(float grau) { 
    mCubeRotation = grau; 
    eixoX = 0.0f; 
    eixoY = 0.0f; 
    eixoZ = 1.0f; 
    surfaceView.requestRender(); // line to call onDrawFrame 
} 

これは回転のコードです:

@Override 
public void onDrawFrame(GL10 gl) { 

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

    gl.glTranslatef(0.0f, 0.0f, -8.0f); 

    // When i rotate x eixoX equal 1 and the other axis is 0. 
    // When i rotate z eixoZ equal 1 and the other axis is 0. 
    gl.glRotatef(mCubeRotation, eixoX, eixoY, eixoZ); 

    mCube.draw(gl); 

    gl.glLoadIdentity(); 

    lock = false; 
} 

誰かが助けている場合私、私は感謝します。

答えて

0

あなたの回転の方法は、明示的に「その他」ローテート方式で設定されたグローバルeixo*変数を追い払ってくれるている、とあなたのdrawメソッドは、glLoadIdentityを経由して、レンダリング状態行列をリセットされるので、あなただけの今までに一回転を得る理由です。

通常、3つの単純な変数と、恒等行列の上にglRotatefへの1回の呼び出しを使用して、何をしようとしているのかはできません。あなたがそれらを正しく注文する必要があるので回転が些細なものでなければ、回転はそれをきちんと連結しません(ワールド空間Xの周りに2回転を適用すると、Yはワールド空間Yの周りの2回転と同じではなく、Xオーダーの問題です) 。これは、通常、任意の開始回転から開始したいフレーム全体で特に当てはまります。一般に、一連のglRotatefコールを既存の行列の上に適用して、徐々にローテーションを生成したいとします。

トピックを軽くオフにしてください - ここで何か選択すれば、OpenGL ES 2.xを使用してアプリケーションのローカルに完全な翻訳マトリックスを維持することをお勧めします。 OpenGL ES 1.1 APIは古くて比較的非効率的です。プッシュ/ポップマトリックススタックは、シーングラフレンダリングエンジンを作成する非常に特殊な方法を前提としています。 OpenGL ES 2.xとシェーダは、最新のすべてのデバイスで利用可能な方法です。

関連する問題