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

时间:2019-06-26 04:02:40

标签: 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度。为什么?

1 个答案:

答案 0 :(得分:1)

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

请参见android.opengl.Matrix

  

矩阵数学实用程序。这些方法适用于 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]

请参见OpenGL ES Shading Language 3.20 Specification, 5.4.2 Vector and Matrix Constructors,第110页:

  

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

     
mat4(float, float, float, float,  // first column
     float, float, float, float,  // second column
     float, float, float, float,  // third column
     float, float, float, float); // fourth column

因此,可以通过轴和平移的4个向量来设置GLSL mat4

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) em>,y轴为(-1,0,0),这将得出矩阵:

 0  1  0  0   // x axis vector
-1  0  0  0   // y axis vector
 0  0  1  0   // z axis vector
 0  0  0  1   // translation vector