Зачем использовать Матрицу для 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 за один раз.
Кроме того, графические процессоры являются мощными и гибкими, но если есть одна вещь, которую они лучше всего делают, это серия множителей с добавлением векторов (хотя более новое оборудование столь же эффективно со скалярными множителями, как и векторными множителями). Матрично-векторные умножения - это просто серия векторно-множителей, и более компактная структура может быть менее эффективной.
Тем не менее, ваша точка зрения не лишена недостатков, я знаю одну успешную игровую консоль с фиксированной функцией, которая имела ограниченные аппаратные регистры для матрицы проекции, чтобы воспользоваться вашей точной точкой, что большинство записей в матрице проекции обычно не используются.,