Матричные режимы при переключении проекции - PullRequest
0 голосов
/ 05 июня 2018

Я вижу это во многих местах, но я не совсем понимаю.Например, этот фрагмент кода:

def update_projection(self):
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()

    if self.perspective_mode:
        self.switch_to_perspective_mode()
    else:
        self.switch_to_parallel_mode()
    glMatrixMode(GL_MODELVIEW)

Эти вопросы могут показаться базовыми, но я не понимаю их работу на практике:

  1. Что именно здесь MatrixMode?
  2. Почему GL_PROJECTION до предложения if проекции?
  3. Зачем переключаться обратно на GL_MODELVIEW?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Чаще всего мы используем MVP, который является матрицей проекции модель-вид.В этом случае есть только 2 матрицы, где GL_MODELVIEW содержит компоненты модели и вида.

Идея этого заключается в том, что:

  • Матрица модели отвечает за помещение модели вмир.Форма обычно располагается вокруг (0,0,0) или, по крайней мере, их вершины, и затем ее можно многократно нарисовать в нескольких местах, манипулируя матрицей модели.
  • Матрица вида обычно представляет положение камеры.Независимо от того, где модели определены в сцене, положение «игрока» или наблюдателя зависит от того, как он видит эти объекты.В большинстве случаев для этого компонента используется процедура lookAt.
  • Матрица проекции - это то, что мы используем для проецирования объектов на экран.Например, он дает информацию о том, что такое поле зрения (но на самом деле зависит от того, что мы используем).Чаще всего используют glOrtho или glFrustum.Они обычно зависят от размера экрана / вида или соотношения сторон.

Таким образом, матрица проекции будет обновляться очень редко или даже никогда (кроме первого раза).Матрица просмотра может часто меняться даже на каждом кадре, если «пользователь» перемещается.Но матрица модели будет постоянно обновляться, как для каждой нарисованной модели или даже чаще (для каждой части каждой модели).

Итак, что код делает:

  • Начните модифицировать матрицу проекции
  • Установить его на идентичность
  • Применить одно или другое (в выражении if)
  • Начать изменение матрицы вида модели

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

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

0 голосов
/ 05 июня 2018
  1. OpenGL (в древней версии, о которой мы здесь говорим) предоставляет несколько матричных стеков: ModelView, Projection (и некоторые другие).Основное отличие состоит в том, что ModelView применяется до расчета освещенности, а затем - проекции.С помощью glMatrixMode можно включить стек матрицы, в котором будут работать следующие команды.Узнайте больше о матричных стеках в этом вопросе .

  2. Это связано с тем, что два метода (switch_to_perspective_mode и switch_to_parallel_mode) установят матрицу проекции, наиболее вероятнолибо ортографическая проекция или перспективная проекция.Так как они должны применяться к стеку проекционных матриц, нужно заранее переключиться на него.

  3. Скорее всего, потому что следующие команды хотят работать с матрицей ModelView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...