我想围绕我定义的特定点旋转元素并动态更改。
我将自己定位于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 :(得分: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;
}
这会定位物体,然后围绕物体的中心旋转。
答案 1 :(得分: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 , y 和 z 值需要计算为世界中对象的当前位置与要旋转的点的位置。你需要自己做这个计算,但那非常简单。