Зачем использовать Матрицу для 3D-проекции?

После поиска вычислений для матрицы проекции (по крайней мере, в OpenGL),

матрица

Зачем использовать Матрицу, когда у нас так много пустых значений? Я считаю 9 записей, помеченных как 0, и только 7, содержащие полезные данные. Почему бы просто не использовать аналогичный одномерный массив и просто хранить данные в форме списка? Не сэкономит ли это память и время на создание функций, которые могут манипулировать матрицами? Я уверен, что весь этот аргумент может быть использован в других темах, что заставляет меня думать,

Какова конкретная причина использования матриц при проектировании трехмерных сред?

3 ответа

Решение

Проекция трехмерной точки (x,y,z) к координатам 2D изображения (X,Y) можно рассчитать как умножение вектора на матрицу в однородных координатах:

[ a_00  a_01  a_02  a_03 ]   [ x ]    [ X W ]
[ a_10  a_11  a_12  a_13 ] * [ y ] =  [ Y W ]
[ a_20  a_21  a_22  a_23 ]   [ z ]    [ Z W ]
[ a_30  a_31  a_32  a_33 ]   [ 1 ]    [  W  ]

с

[ X W ]   [ x a_00 + y a_01 + z a_02 + a_03 ]
[ Y W ]   [ x a_10 + y a_11 + z a_12 + a_13 ]
[ Z W ] = [ x a_20 + y a_21 + z a_22 + a_23 ]
[  W  ]   [ x a_30 + y a_31 + z a_32 + a_33 ]

И координаты пикселей (X,Y) получены путем деления первого и второго рядов на четвертый ряд. Этот шаг - преобразование из однородных в декартовы координаты.

Третья строка матрицы проекции OpenGL настроена таким образом, чтобы Z становится прогнозируемой глубиной, которая такова, что z значения между n а также f (ближняя и дальняя плоскости) отображаются на -1...1, Это используется для проверки глубины / отсечения. Потому что четвертый ряд [0 0 -1 0]преобразование из однородных в декартовы координаты соответствует делению на -z, что приводит к трансформации перспективы (с перевернутой глубиной).

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

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

Несколько преобразований, которые должны применяться друг за другом, также могут быть объединены в одну матрицу 4x4 путем умножения матриц. Например, вращение вокруг оси X, Y и Z или матрицы MVP. Это матрица проекции модель-вид, которая переводит 3D-точку в локальной системе координат одного объекта в 3D-сцене в ее конечную пиксельную координату на экране. На этих комбинированных матрицах все компоненты могут быть ненулевыми.

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

Речь идет не только об отдельных значениях, но и о математических свойствах матрицы. И нули так же важны, как и ненулевые значения! Само расположение значений имеет смысл!

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

Таким образом, в трехмерном пространстве у вас есть 3 значения на позицию: вы должны перевести эти три значения в 3 значения на вашем экране (третье значение преобразуется в значение, которое используется для сравнения глубины) и 4-е значение (для позиции и пункта назначения) используется для искажения перспективы. Таким образом, для каждого из 4 значений в исходной позиции вы должны знать, насколько он влияет на каждое из 4 значений в выходных данных. Если это не помогает (и это так же важно), то это 0. Таким образом, вам нужно всего 4 · 4 = 16 значений. Следовательно, матрица 4×4.

Вероятно, довольно редко, что матрица проекции будет использоваться как есть. Как правило, вы с большей вероятностью объединяете матрицу проекции с матрицами мира и вида и умножаете на матрицу world-view-proj за один раз.

Кроме того, графические процессоры являются мощными и гибкими, но если есть одна вещь, которую они лучше всего делают, это серия множителей с добавлением векторов (хотя более новое оборудование столь же эффективно со скалярными множителями, как и векторными множителями). Матрично-векторные умножения - это просто серия векторно-множителей, и более компактная структура может быть менее эффективной.

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

Другие вопросы по тегам