Начнём с того, что вектор имеет три координаты: x, y и z. Все повороты системы координат (x, y, z) → (x', y', z'), масштабирования и их комбинации можно записать в виде
x' = a11·x + a12·y + a13·z
y' = a21·x + a22·y + a23·z
z' = a31·x + a32·y + a33·z
А теперь прочитайте, что такое «умножить матрицу на вектор». Узнаёте? — матрицу {a
ij} размером 3×3 умножаем на вектор-столбец (x, y, z)
T и получаем вектор-столбец (x', y', z')
T. Здесь буква T — это операция «транспонировать матрицу», заменить строки столбцами, а столбцы — строками.
А теперь сделаем финт ушами. Возьмём 4-векторы (r, s, t, d) и обозначим x=r/d, y = s/d, z = t/d (так называемые однородные координаты). Преобразование в однородные координаты неоднозначно: декартовы координаты (1, 2, 3) можно обозначить как четвёркой (1, 2, 3, 1), так и четвёркой (10, 20, 30, 10). Для чего нам однородные? Матрицы 4×4, работающие над однородными координатами, позволяют записать и такие преобразования, как «сдвинуть» или «центральная проекция». Например, «сдвинуть» записывается как
r' = 1·r + shiftx·d
s' = 1·s + shifty·d
t' = 1·t + shiftz·d
d' = d
или, в терминах матриц
[r'] ( 1 0 0 shiftx ) [r]
[s'] = ( 0 1 0 shifty ) · [s]
[t'] ( 0 0 1 shiftz ) [t]
[d'] ( 0 0 0 1 ) [d]
(тут я не поленился собрать тэгом code нечто похожее на вектор-столбец, так что знак транспонирования не нужен :)