例如,如果我提供以下参数:
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度。为什么?
答案 0 :(得分:1)
这是因为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]
请参见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