2016-04-20 47 views
0

這是一個Android應用程序。我想在OpenGLES 2.0中使用Matrix旋轉一個帶有觸摸事件的球體。但是角度不對。看起來旋轉不穩定。我想只在水平觸摸時才旋轉x,而在垂直觸摸時只旋轉y。但實際上,當我水平觸摸時,它會旋轉x和y,當我垂直觸摸時... ...旋轉角度和角度或矩陣的計算出錯了嗎? 這裏是觸摸事件:Android OpenGL ES旋轉帶觸摸事件的3D對象

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; 
    } 

這是矩陣設置:

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,任何之前的角度(通過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