2016-04-20 14 views
0

これはAndroidアプリケーションです。 OpenGLES 2.0のMatrixを使用してタッチイベントで球を回転させたいしかし、角度は正しくありません。回転が安定していないようです。水平にタッチするとxだけ回転し、垂直にタッチするとyだけ回転します。しかし、実際には、私が水平に触れるとxとyを回転させるので、垂直に触れたときと同じように...回転角度と角度または行列の回転の計算に何か問題がありますか?Android OpenGL ESタッチイベント付き3Dオブジェクトを回転

public void onDrawFrame(GL10 unused) { 
    // Draw background color 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    //set up the matrix 
    float [] mTempMatrix = new float[16]; 
    Matrix.setIdentityM(mModelMatrix, 0); // initialize to model matrix 
    Matrix.setIdentityM(mTranslateMatrix,0); 
    Matrix.translateM(mTranslateMatrix, 0, 0.0f, 0.0f, 0.0f); 
    mTempMatrix = mModelMatrix.clone(); 
    Matrix.multiplyMM(mModelMatrix,0,mTempMatrix,0,mTranslateMatrix,0); 

    Matrix.setIdentityM(mRotationMatrix,0); 
    Matrix.rotateM(mRotationMatrix, 0, mAngleX, 0,1,0); 
    Matrix.rotateM(mRotationMatrix, 0, mAngleY, 1,0,0); 
    mTempMatrix = mModelMatrix.clone(); 
    Matrix.multiplyMM(mModelMatrix,0,mTempMatrix,0,mRotationMatrix,0); 

    Matrix.setIdentityM(mScaleMatrix,0); 
    Matrix.scaleM(mScaleMatrix,0, 1f, 1f, 1f); 
    mTempMatrix = mModelMatrix.clone(); 
    Matrix.multiplyMM(mModelMatrix,0,mTempMatrix,0,mScaleMatrix,0); 
    Matrix.setLookAtM(mViewMatrix, 0, 
      mLocation.x,mLocation.y,mLocation.z, 
      mTarget.x,mTarget.y,mTarget.z, 
      mUp.x,mUp.y,mUp.z);//camera 
    mTempMatrix = mViewMatrix.clone(); 

    Matrix.multiplyMM(mViewMatrix, 0, mTempMatrix,0,mModelMatrix,0); 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); 

    mSphere.draw(mMVPMatrix); 
} 
+0

「角度は適切ではない」の具体的下さい。 –

+0

回転が安定していないようです。水平にタッチするとxだけ回転し、垂直にタッチするとyだけ回転します。しかし、実際には、水平にタッチするとxとyが回転しますので、垂直にタッチすると... @ jonas.koeritz – Eleanor

答えて

1

あなたが使用しているため

mRenderer.setAngleX(mRenderer.getAngleX() + (dx * TOUCH_SCALE_FACTOR)); 

たとえdxは0、いずれかであるように私には思える:

public boolean onTouchEvent(MotionEvent e) { 
    float x = e.getX(); 
    float y = e.getY(); 

    switch (e.getAction()) { 
     case MotionEvent.ACTION_MOVE: 

      float dx = x - mPreviousX; 
      float dy = y - mPreviousY; 

      mRenderer.setAngleX(mRenderer.getAngleX() + (dx * TOUCH_SCALE_FACTOR)); 
      mRenderer.setAngleY(mRenderer.getAngleY() - (dy * TOUCH_SCALE_FACTOR)); 
      requestRender(); 
    } 
     mPreviousX = x; 
     mPreviousY = y; 
     return true; 
    } 

は、このセットアップ行列である: はここにタッチイベントであります以前の角度(mRenderer.getAngleX()まで)は次の繰り返しで再適用されます。 だけでdxではなくmAngleXを変更する(そしてもちろんmAngleYのための同じを)してみましょう:

mRenderer.mAngleX += dx * TOUCH_SCALE_FACTOR; 
+0

このように意味します:mRenderer.mAngleX + = mRenderer.mAngleX + dx * TOUCH_SCALE_FACTOR; ? @reden – Eleanor

+1

いいえ、mRenderer.mAngleX + = dx * TOUCH_SCALE_FACTOR; – reden

+0

ありがとう~~~働いて、@reden – Eleanor