我正在尝试围绕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);
但是当我做这样的事情时:
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个参数。您必须根据需要设置它们。