Почему android.Matrix.setRotateM возвращает матрицу, направление вращения которой противоположно ожидаемой матрице вращения? - PullRequest
1 голос
/ 26 июня 2019

Например, если я дам следующие параметры:

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 Ответ

1 голос
/ 28 июня 2019

Это потому, что матрицы 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
...