在同一轴上平移和旋转时出现奇怪的行为
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个参数。您必须根据需要设置它们。
我正在尝试围绕其中心旋转 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个参数。您必须根据需要设置它们。