Назначение матрицы проекции вида модели

102

Для каких целей мы используем матрицу проекции вида модели? Почему шейдерам требуется матрица проекции вида модели?

Юрий Викулов
источник
12
Просто посмотрите эту ссылку: songho.ca/opengl/gl_transform.html
iKushal,
3
Я предложил открыть сайт Stack Exchange, посвященный компьютерной графике, и выбрал этот вопрос в качестве примера . Подпишитесь на computergraphics.stackexchange.com, если хотите увидеть, как запускается сайт!
wip

Ответы:

196

Матрицы модели, вида и проекции - это три отдельные матрицы. Модель отображает из локального координатного пространства объекта в мировое пространство, вид из мирового пространства в пространство камеры, проекция с камеры на экран.

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

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

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

Томми
источник
3
так что для нескольких объектов (сеток) нам нужно несколько матриц modelView, не так ли?
Юрий Викулов
5
Если предположить, что они могут двигаться независимо или размещены отдельно, тогда да. Так что это, безусловно, самый распространенный способ продолжить - передать modelView или projectionModelView в качестве униформы программе шейдера, настроив ее для текущей модели на ЦП.
Tommy
Привет, Томми, можете ли вы предложить любой образец кода для функции панорамирования в Opengl Es2.0 в Android, используя эту матрицу проекции вида модели, если это возможно. Я просмотрел больше ссылок, я не смог получить четкого представления. Если какой-либо пример кода означает, его легко понять для меня ..
harikrishnan
1
У меня есть вопрос. Если openGL использует матрицу MV как единое целое, и если мы перейдем из пространства камеры в мировое пространство, нам потребуется инвертировать (матрица проекции * матрица просмотра) * (позиция курсора), но если модель-представление является одной составной матрицей. как мы разделяем модель и матрицу представления, чтобы я мог использовать матрицу представления для этого расчета. Значит, мне нужно держать их отдельно?
Evren Bingøl
@ EvrenBingøl Вы уже получили ответ? Я сохранил свою модель и матрицы просмотра отдельно, но я хотел бы знать фактический ответ на ваш вопрос, следует ли мне продолжать делать это отдельно или нет.
tom_mai78101 07
9

Потому что матрицы удобны. Матрицы помогают преобразовывать местоположения / направления относительно различных пространств (пространство может быть определено 3 перпендикулярными осями и началом координат).

Вот пример из книги, указанной @ legends2k в комментариях.

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

Вот еще один пример,

Предположим, что вы создали объект автомобиля в игре с его положениями вершин, используя мировые координаты. Предположим, вам нужно использовать эту же машину в какой-то другой игре в совершенно другом мире, вам нужно снова определить позиции, и вычисления будут сложными. Это потому, что вам снова нужно рассчитать положение окна, капота, фар, колес и т. Д. В машине по отношению к новому миру.

Посмотрите это видео, чтобы понять концепции модели, вида и проекции. (настоятельно рекомендуется)

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

Cegprakash
источник
Если вы подумаете об этом глубоко, вы поймете, что, несмотря на то, что преобразование основано на происхождении объекта (то есть в одной точке), все вершины объекта (формально сетка / модель) претерпят преобразование, т.е. все 1000 вершин будут умножены. по матрице модели. Следовательно, ваша точка зрения неверна. Матрица модели - это просто матрица, которая преобразует вершины в пространстве модели в мировое пространство. Здесь нет преимущества в производительности, просто удобство.
legends2k
Если да, то почему они просто не представляют каждую точку в одном трехмерном пространстве? Должны быть преимущества, когда вы используете вывод одной сцены в другую сцену, которая может быть входом в другую подвижную сцену :)
cegprakash
1
Они не представляют все вершины в одном пространстве, поскольку в относительном пространстве удобнее работать, чем в большом пространстве, таком как мир. Скажем, роботу, когда ему приказывают двигаться на 2 метра вперед, делать это глазами более уместно, чем определять местонахождение центра мира и затем вычислять правильные результирующие координаты.
legends2k
Думаю, вы правы ... В любом случае для каждого пикселя будет вызываться фрагментный шейдер, а в случае сложных сеток мы будем выполнять матричное умножение для каждого пикселя. : |
cegprakash
2
В фрагментном шейдере выполняются только расчеты освещения / окраски, к тому времени, когда данные достигают фрагментного шейдера, все вычисления положения завершены (то есть в вершинном шейдере); лучшее объяснение того, зачем использовать несколько систем координат, можно найти здесь . Эта книга - отличный ресурс по математике для 3D-игр. Та же глава, что и образец PDF с веб-сайта книги .
legends2k