在同一轴上平移和旋转时出现奇怪的行为

Strange behevior when translating and rotating in the same axis

我正在尝试围绕其中心旋转 OpenGL ES 中的对象。当我在同一轴上使用 Matrix.translateM() 时,Matrix.setRotatem() 将我的对象中心更改为该轴上的 0。 当我尝试以下操作时:

Matrix.translateM(rotationMatrix, OFFSET, 0, 1, 0);
Matrix.setRotateM(rotationMatrix, OFFSET, 90, 0, 1, 0);
Matrix.translateM(rotationMatrix, OFFSET, 0, -1, 0);

那么效果就是:

但是当我做这样的事情时:

Matrix.translateM(rotationMatrix, OFFSET, 0, 0, 0);
Matrix.setRotateM(rotationMatrix, OFFSET, 90, 0, 1, 0);
Matrix.translateM(rotationMatrix, OFFSET, 0, 0, 0);

效果是:

第二张图是正确的样子。所以,我的问题是:为什么在 y 轴上翻译会造成这种混乱。

如果你想围绕一个枢轴旋转一个对象,那么你必须:

  • 以这种方式平移对象,即枢轴位于原点 (0, 0, 0)。
    由于您的对象位于 (0, 1, 0),这意味着对象必须由 (0, -1, 0) 翻译。

  • 旋转对象。如果对象必须在屏幕的投影平面中旋转,则旋转轴必须是 z 轴 (0, 0, 1)。如果对象必须绕垂直轴旋转,则旋转轴必须是 z 轴 (0, 1, 0)。对于绕水平轴的旋转,对象必须绕 x 轴 (0, 1, 0) 旋转。

  • 以枢轴回到其原始位置的方式平移矩形。
    这意味着对象必须按 (0, 1, 0).

  • 进行翻译
rotationMatrix = translate(0, 1, 0) * rotate * translate(0, -1, 0)

您必须分别使用 Matrix 操作 Matrix.translateM Matrix.rotateM,这将创建一个新矩阵并将输入矩阵乘以新矩阵:

private float[] rotationMatrix = new float[16];
Matrix.setIdentityM(rotationMatrix, 0);

Matrix.translateM(rotationMatrix, 0, 0, 1, 0);
Matrix.rotateM(rotationMatrix, 0, 90, 0, 0, 1);
Matrix.translateM(rotationMatrix, 0, 0, -1, 0);

注意,旋转轴是Matrix.rotateM的最后3个参数。您必须根据需要设置它们。