Подтвердить что ты не робот

Понимание макетов OpenGL

Я начинаю изучать 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 использует этот вид данных.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Это называется однородными координатами. Это позволяет сделать перспективную проекцию выразительной с помощью матрицы, которая может снова сочетаться со всеми другими преобразованиями.

Например, поскольку объекты, расположенные дальше, должны быть меньше на экране, мы преобразуем 3D-координаты в 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 ]

то реальные 3D-координаты станут

x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1

поэтому нам просто нужно отрубить z-координату для проецирования в 2D.