Это происходит из спецификации OpenGL -
Точка путаницы именно в этом: как уже отмечали другие, мы индексируем главную матрицу столбца , причем первый индекс указывает на столбец, а не на строку :
m00
относится к столбец = 0, строка = 0 ,
m01
относится к столбец = 0, строка = 1 ,
m02
относится к столбец = 0, строка = 2 ,
MATLAB, вероятно, многое сделал, чтобы косвенно способствовать этой путанице, в то время как MATLAB действительно использует основной столбец для своего внутреннего представления данных , он по-прежнему использует мажор строки соглашение об индексировании x(row,col)
. Я не уверен, почему они это сделали.
Также обратите внимание, что OpenGL по умолчанию использует вектор-столбцы - то есть ожидается, что вы умножите матрицу на вектор, который она преобразует, как (MATRIX*VECTOR)
в шейдере. Сравните с (VECTOR*MATRIX)
, что вы бы использовали для матрицы строк.
Может быть полезно посмотреть на мою статью о матрицах основных строк и основных столбцов в C .
Основная колонка нелогична при размещении матриц в коде
Чем больше я смотрю на это, тем больше я думаю, что работать в главном столбце кода на C - ошибка из-за необходимости мысленно переносить то, что вы делаете. Когда вы размещаете матрицу в коде, вы ограничены слева направо нашего языка записывать матрицу строка за строкой:
float a[4] = { 1, 2,
3, 4 };
Итак, очень естественно выглядит, как вы указываете по строке, матрица
1 2
3 4
Но если вы используете спецификацию основного столбца, то вы фактически указали матрицу
1 3
2 4
Что действительно нелогично. Если бы у нас был вертикаль (или язык "столбцов") , то указание основных матриц столбцов в коде было бы проще.
Является ли все это еще одним аргументом для Direct3D? Я не знаю, вы говорите мне.
Действительно, почему тогда OpenGL использует мажорные матрицы столбцов?
Копая глубже , похоже, что причина, по которой это было сделано , была в том, чтобы иметь возможность "разносить" матрицы по векторам как (MATRIX*VECTOR)
- т.е. использовать столбец (основной) векторов как :
Умножение основной матрицы столбцов
┌ 2 8 1 1 ┐ ┌ 2 ┐
│ 2 1 7 2 │ │ 2 │
│ 2 6 5 1 │ │ 2 │
└ 1 9 0 0 ┘ └ 1 ┘
Сравните это с необходимостью использовать векторы строк:
Умножение матрицы на ряд
[ 2 2 2 1 ] ┌ 2 8 1 1 ┐
│ 2 1 7 2 │
│ 2 6 5 1 │
└ 1 9 0 0 ┘
Дело в том, если матрицы указаны как мажорные строки, то вы "должны" использовать векторы строк и предварительно умножить матрицы на вектор, который они преобразуют .
Причина, по которой вы "должны" использовать векторы строк при использовании матриц основных строк, заключается в согласованном представлении данных : в конце концов, вектор строк - это всего лишь 1 строка, 4 столбца матрицы.