В большинстве 3D-графики точка представлена 4-компонентным вектором (x, y, z, w), где w = 1. Обычные операции, применяемые к точке, включают перемещение, масштабирование, вращение, отражение, наклон и комбинирование из этих.
Эти преобразования могут быть представлены математическим объектом под названием «матрица». Матрица применяется к вектору так:
[ a b c tx ] [ x ] [ a*x + b*y + c*z + tx*w ]
| d e f ty | | y | = | d*x + e*y + f*z + ty*w |
| g h i tz | | z | | g*x + h*y + i*z + tz*w |
[ p q r s ] [ w ] [ p*x + q*y + r*z + s*w ]
Например, масштабирование представляется как
[ 2 . . . ] [ x ] [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z | | 2z |
[ . . . 1 ] [ 1 ] [ 1 ]
и перевод как
[ 1 . . dx ] [ x ] [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z | | z + dz |
[ . . . 1 ] [ 1 ] [ 1 ]
Одна из причин, по которой 4-й компонент состоит в том, чтобы сделать перевод представимым с помощью матрицы.
Преимущество использования матрицы состоит в том, что несколько преобразований можно объединить в одно с помощью умножения матрицы.
Теперь, если цель состоит в том, чтобы просто перенести перевод на таблицу, тогда я бы сказал (x, y, z, 1) вместо (x, y, z, w) и сделал бы последнюю строку матрицы всегда [0 0 0 1]
, как обычно для 2D-графики. Фактически, 4-компонентный вектор будет преобразован обратно в нормальный 3-векторный вектор по следующей формуле:
[ x(3D) ] [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ] [ z / w ]
Это называется однородные координаты . С учетом этого перспективная проекция также может быть выражена с помощью матрицы , которая снова может комбинироваться со всеми другими преобразованиями.
Например, поскольку объекты, находящиеся дальше, должны быть меньше на экране, мы преобразуем трехмерные координаты в 2D, используя формулу
x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))
Теперь, если мы применим матрицу проекции
[ 1 . . . ] [ x ] [ x ]
| . 1 . . | | y | = | y |
| . . 1 . | | z | | z |
[ . . 10 . ] [ 1 ] [ 10*z ]
тогда настоящие трехмерные координаты станут
x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1
, поэтому нам просто нужно вырезать координату z, чтобы проецировать в 2D.