2014-12-27 93 views
0

我想圍繞由我定義的特定點旋轉元素並動態更改。Android OpenGL ES 2.0:圍繞特定點旋轉對象

我正在從the google developers site指導自己。

我的第一種方法是這樣的:

scratch = new float[16]; 
Matrix.setIdentityM(mRotationMatrix, 0); 
Matrix.setRotateM(mRotationMatrix, 0, angle, 0, 0, 1f); 
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0); 
element.draw(scratch); 

這繞了屏幕中心的對象。

我必須添加/更改什麼來使對象圍繞其他點旋轉?

回答

0

添加翻譯操作。

Grafika的Sprite2d類提供了一個例子:

/** 
* Re-computes mModelViewMatrix, based on the current values for rotation, scale, and 
* translation. 
*/ 
private void recomputeMatrix() { 
    float[] modelView = mModelViewMatrix; 

    Matrix.setIdentityM(modelView, 0); 
    Matrix.translateM(modelView, 0, mPosX, mPosY, 0.0f); 
    if (mAngle != 0.0f) { 
     Matrix.rotateM(modelView, 0, mAngle, 0.0f, 0.0f, 1.0f); 
    } 
    Matrix.scaleM(modelView, 0, mScaleX, mScaleY, 1.0f); 
    mMatrixReady = true; 
} 

此定位所述對象,然後使其旋轉圍繞對象的中心。

+0

這仍然使對象圍繞屏幕中心旋轉。 – 2014-12-27 17:27:16

+0

運行Grafika,選擇「來自相機的紋理」活動。觸摸屏幕設置位置,使用滑塊設置旋轉。請注意,矩形是圍繞自己的中心旋轉,而不是屏幕中心。該活動通過顯示的類來實現。如果翻譯沒有效果,那麼代碼中的其他內容會導致它被忽略。 – fadden 2014-12-27 19:22:16

0

您需要首先在點的相反方向上轉換矩陣,然後旋轉然後再將其轉換回來。看看它,就好像旋轉總是圍繞着世界的中心旋轉一樣,而翻譯則移動了世界的中心。

像這樣(未測試):

scratch = new float[16]; 
Matrix.setIdentityM(mRotationMatrix, 0); 
Matrix.translateM(mRotationMatrix, 0, -x, -y, -z); 
Matrix.rotateM(mRotationMatrix, 0, angle, 0, 0, 1f); 
Matrix.translateM(mRotationMatrix, 0, x, y, z); 
Matrix.multiplyMM(scratch, 0, mMVPMatrix, 0, mRotationMatrix, 0); 
element.draw(scratch); 

XÿŽ值需要被計算作爲對象的在世界上的當前位置和之間的增量要旋轉的點的位置。你需要自己做這個計算,但這很簡單。

+0

這會改變旋轉的半徑,但它仍然圍繞屏幕中心旋轉。 – 2014-12-27 17:41:26

+0

這看起來像是轉換的錯誤順序。例如,請參閱此處接受的正確順序的答案:http://stackoverflow.com/q/23442499/3530129。 – 2014-12-27 19:07:03

+0

現在,物體繞着自己的軸旋轉,繞着屏幕旋轉...... :-) – 2014-12-27 19:26:26