Понимание макетов 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 использует этот вид данных.
Ответы
Ответ 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.