2012-05-11 46 views
3

移動するオブジェクトを回転しようとしていますが、座標系の中心を回転させます。動いている間にそれ自身の周りを回転させる方法は?コードは:OpenGL ES 2.0:Android上でオブジェクトを回転させる

Matrix.translateM(mMMatrix, 0, 0, -y, 0); 
Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f); 
y += speed; 
Matrix.translateM(mMMatrix, 0, 0, y, 0); 
+0

[OpenGLでローカル軸を中心にオブジェクトを回転させるにはどうすればいいですか?](http://stackoverflow.com/questions/1671210/how-to-rotate-object-around-local-axis-in-opengl)これは質問(と答え)は古いGL固定関数を使うかもしれませんが、その背後にある数学はあなたがやっていることとまったく同じです。 –

+0

私は実際には、その質問から私の問題の解決策を見つけることができません – nifuki

答えて

0

ここでオブジェクト描画を行いますか?

私は、それはあなたがここに我慢しているコードの後に​​あるようなものとします2番目の呼び出しは問題である翻訳し、その後

Matrix.translateM(mMMatrix, 0, 0, -y, 0); 
Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f); 
y += speed; 
Matrix.translateM(mMMatrix, 0, 0, y, 0); 
drawHere();//<<<<<<<<<<<<<<<<<<< 

を。 2回目の翻訳の前に描画呼び出しを移動する必要があります。 または それを行うにはクリーンな方法がある:私はちょうどビュー行列の代わりに、モデル行列を使用し、すべてが働い

Matrix.setIdentityM(mMMatrix, 0);//<<<<<<<<added 
Matrix.translateM(mMMatrix, 0, 0, -y, 0); 
Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f); 
y += speed; 
//Matrix.translateM(mMMatrix, 0, 0, y, 0); //<<<<<<<<<removed 
drawHere(); 
+0

私は、表面を作成するときに単位行列を設定します。なぜ2番目の翻訳が問題なのですか?私は原点に移動し、回転させて新しい座標に変換します。 – nifuki

+0

あなたのコードをテストしましたが、あなたが言ったように問題があります。私は上記の私のasnwerのようにそれを修正しました。さて、あなたがオブジェクト描画を行っている場所を教えてください。 – CuriousChettai

0

。モデル、ビュー、および投影行列の詳細についてはseeを参照してください。

2

オブジェクトを回転するためにビュー行列を使用しないでください。この行列はすべてのシーンのカメラとして使用されます。オブジェクトを変換するには、モデル行列を使用する必要があります。

public void transform(float[] mModelMatrix) { 
    Matrix.setIdentityM(mModelMatrix, 0); 
    Matrix.translateM(mModelMatrix, 0, 0, y, 0); 
    Matrix.rotateM(mModelMatrix, 0, mAngle, 0.0f, 0.0f, 1.0f); 
} 

ドンの `tは、すべてのループ内で変換をリセットするために単位行列を使用し忘れ:自身の中心の周りに回転させる場合には、次のメソッドを使用することができます。

あなたのコードは悪いと思います。変換を適用する前に 'y'の値を更新してください。 、renderメソッド

private void updateMVP( 
     float[] mModelMatrix, 
     float[] mViewMatrix, 
     float[] mProjectionMatrix, 
     float[] mMVPMatrix) { 

    // combine the model with the view matrix 
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); 

    // combine the model-view with the projection matrix 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); 
} 

そして最後のオブジェクトをペイントするシェーダーを実行します:

public void onDrawFrame(GL10 gl) { 
    ... 
    y += speed; 
    transform(mModelMatrix); 
    updateMVP(mModelMatrix, mViewMatrix, mProjectionMatrix, mMVPMatrix); 
    renderObject(mMVPMatrix); 
    ... 
} 

updateMVP方法、モデル、ビューおよび投影行列を結合します

public void renderObject(float[] mMVPMatrix) { 

    GLES20.glUseProgram(mProgram); 

    ... 

    // Pass the MVP data into the shader 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0); 

    // Draw the shape 
    GLES20.glDrawElements (...); 
} 

これがあなたを助けてくれることを願っています。

+1

答えを説明するためのコードを追加できますか? –

関連する問題