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

问题描述 投票:0回答:1

我正在尝试围绕OpenGL ES的中心旋转对象。当我在同一轴上使用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);

然后效果是:enter image description here

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

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

效果是:enter image description here

第二张图片是正确的外观。因此,我的问题是:为什么在y轴上平移会造成这种混乱。

java android matrix opengl-es
1个回答
0
投票

如果要围绕枢轴旋转对象,则必须:

  • 以这种方式平移对象,即轴位于原点(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个参数。您必须根据需要设置它们。

© www.soinside.com 2019 - 2024. All rights reserved.