Android OpenGL ES 2.0:围绕特定点旋转对象

时间:2014-12-27 15:37:22

标签: android opengl-es matrix-multiplication

我想围绕我定义的特定点旋转元素并动态更改。

我将自己定位于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);

这会使对象围绕屏幕中心旋转。

我需要添加/更改以使对象围绕其他点旋转吗?

2 个答案:

答案 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 值需要计算为世界中对象的当前位置与要旋转的点的位置。你需要自己做这个计算,但那非常简单。