为什么android.Matrix.setRotateM返回旋转方向与预期旋转矩阵相反的矩阵?

为什么android.Matrix.setRotateM返回旋转方向与预期旋转矩阵相反的矩阵?,android,matrix,opengl-es,rotation,glsl,Android,Matrix,Opengl Es,Rotation,Glsl,例如,如果我给出以下参数: float[] rotateMatrix = identityMatrix.clone(); Matrix.setRotateM(rotateMatrix, 0, 90, 0, 0, 1); 我希望矩阵逆时针旋转90度,应该是: 0 -1.0 1.0 0 但实际上返回的rotateMatrix是: 0 1.0 -1.0 0 奇怪的是,渲染输出是正确的,图像逆时针旋转90度(而不是顺时针)。为什么? 这是因为O

例如,如果我给出以下参数:

float[] rotateMatrix = identityMatrix.clone();
Matrix.setRotateM(rotateMatrix, 0, 90, 0, 0, 1);
我希望矩阵逆时针旋转90度,应该是:

0       -1.0     
1.0    0
但实际上返回的rotateMatrix是:

0       1.0    
-1.0    0
奇怪的是,渲染输出是正确的,图像逆时针旋转90度(而不是顺时针)。为什么?

这是因为OpenGL(ES)矩阵是由向量按列主顺序指定的

见:

矩阵数学实用程序。这些方法在OpenGL ES格式矩阵和浮点数组中存储的向量上运行

矩阵是按列主顺序存储的4 x 4列向量矩阵:

m[offset +  0] m[offset +  4] m[offset +  8] m[offset + 12]
m[offset +  1] m[offset +  5] m[offset +  9] m[offset + 13]
m[offset +  2] m[offset +  6] m[offset + 10] m[offset + 14]
m[offset +  3] m[offset +  7] m[offset + 11] m[offset + 15]
见第110页:

要通过指定向量或标量来初始化矩阵,组件将按列主顺序分配给矩阵元素

mat4(float,float,float,float,//第一列
float,float,float,float,//第二列
float,float,float,float,//第三列
浮动,浮动,浮动,浮动);//第四栏
因此,GLSL
mat4
可以通过轴和平移的4个向量进行设置:

mat4 m44=mat4(
vec4(Xx,Xy,Xz,0.0),
vec4(Yx,Xy,Yz,0.0),
vec4(Zx-Zy-Zz,0.0),
vec4(Tx,Ty,Tz,1.0));
绕z轴(0,0,1)向右(逆时针)进行数学旋转后,x轴为(0,1,0),y轴为(-1,0,0),从而得出矩阵:

0 1 0//x轴矢量
-1 0//y轴矢量
0 1 0//z轴矢量
01//平移向量

是因为返回的矩阵是列主顺序,因此我将其解释为错误的吗?