Вопрос

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

Это было полезно?

Решение

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

К трехмерному значению, представляющему точку в пространстве, всегда добавляется 1 в качестве четвертого значения, чтобы этот трюк сработал.Трехмерное значение, представляющее направление (т.е.нормальный, если вы знакомы с этим термином) получает 0, добавленный в четвертом месте.

Другие советы

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

тогда реальные трехмерные координаты стали бы

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

итак, нам просто нужно обрезать координату z, чтобы спроецировать на 2D.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top