为什么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,//第三列
浮动,浮动,浮动,浮动);//第四栏
因此,GLSLmat4
可以通过轴和平移的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//平移向量
是因为返回的矩阵是列主顺序,因此我将其解释为错误的吗?