Это потому, что матрицы OpenGL (ES) задаются векторами в главном порядке столбцов.
См. android.opengl.Matrix
:
Матричные математические утилиты.Эти методы работают с матрицами формата OpenGL ES и векторами, хранящимися в массивах с плавающей точкой.
Матрицы представляют собой матрицы 4 × 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 3.20 Спецификация, 5.4.2 Векторные и матричные конструкторы , стр. 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
Таким образом, 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) и ось у равна (- 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