Понимание матриц OpenGL - PullRequest
18 голосов
/ 17 марта 2010

Я начинаю изучать 3D-рендеринг, и я добился хорошего прогресса. Я много подобрал в отношении матриц и общих операций над ними.

Одна вещь, которую я до сих пор не совсем понимаю, это использование матриц в OpenGL. Я вижу это (и тому подобное) довольно много:

x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Итак, насколько я понимаю, это нормализованная (без величины) 4-мерная матрица с основными столбцами. Кроме того, эта матрица, в частности, называется «единичной матрицей».

Некоторые вопросы:

  • Что такое "n" измерение?
  • Как и когда они применяются?

Моя самая большая путаница возникает из-за того, как OpenGL использует такие данные.

Ответы [ 2 ]

60 голосов
/ 17 марта 2010

В большинстве 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.

3 голосов
/ 18 марта 2010

Краткий ответ, который может помочь вам начать работу, заключается в том, что n-е измерение, как вы его называете, не представляет никакой визуализируемой величины. Он добавлен в качестве практического инструмента для умножения матриц, которые вызывают перевод и перспективное проецирование. Интуитивно понятная матрица 3х3 не может делать такие вещи.

Значение 3d, представляющее точку в пространстве, всегда добавляется к четвертому значению, чтобы этот трюк работал. Значение 3d, представляющее направление (то есть нормаль, если вы знакомы с этим термином), добавляется в 0 в четвертом месте.

...