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


person Alexander Trauzzi    schedule 17.03.2010    source источник
comment
Ознакомьтесь с книгой Essential Mathematics for Games and Interactive Applications ‹essentialmath.com/book.htm› .   -  person Mr. Berna    schedule 18.03.2010
comment
Нормализованный вектор не является величиной. Нормализованные векторы имеют длину/величину 1.   -  person alesplin    schedule 20.03.2010
comment
Спасибо! Наверное, я увлекся пониманием. По крайней мере, я был на правильном пути. ;)   -  person Alexander Trauzzi    schedule 20.03.2010
comment
Связанный с этим вопрос: gamedev.stackexchange.com/questions/72044/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 25.03.2016
comment
связанные вопросы и ответы: Понимание матриц гомогенного преобразования 4x4   -  person Spektre    schedule 14.04.2016


Ответы (2)


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

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

person Alan    schedule 18.03.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    ]

Одна из причин использования четвертого компонента – сделать перевод представляемым матрицей.

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

Теперь, если цель состоит в том, чтобы просто внести перевод в таблицу, то я бы сказал (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 ]

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

Например, поскольку удаленные объекты должны быть меньше на экране, мы преобразуем трехмерные координаты в двухмерные с помощью формулы

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.

person kennytm    schedule 17.03.2010
comment
Я хотел бы понять ваши примеры, но я не очень понимаю. Я прошу прощения. - person Alexander Trauzzi; 17.03.2010
comment
@ Omega Этот раздел Красной книги OpenGL может помочь glprogramming.com/red/appendixf.html #имя1 - person Swiss; 17.03.2010
comment
@Omega Возможно, основы тоже полезны [en.wikipedia.org/wiki/Matrix_multiplication] . - person Luca; 18.03.2010
comment
Постепенно я получаю это. Имейте в виду, мне также нужно понять реализацию OpenGL. Думаю, я понимаю, что OpenGL использует матрицы в качестве базового типа данных для определения различных преобразований. Похоже, что многие функции в API предназначены для создания этих матриц. Несмотря на это, я определенно изучил различные арифметические операции, которые вы можете выполнять с ними. - person Alexander Trauzzi; 18.03.2010