Что делает glLoadIdentity() в OpenGL?

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

Я знаю, что glLoadIdentity() заменяет текущую матрицу идентичной матрицей, но что именно это делает? Если это требуется каждой программе, почему по умолчанию не используется матрица тождеств, если не указано иное? Мне не нравится иметь функции в моем коде, если я не знаю, что они делают. Я должен отметить, что я использую OpenGL исключительно для богатых 2D-клиентов, поэтому извините за мое незнание, если это что-то очень очевидное для 3D.

Также немного запутался насчет glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW).

Ответ 1

Единичная матрица в терминах матриц проекции и отображения модели существенно сбрасывает матрицу обратно в ее состояние по умолчанию.

Как вы, надеюсь, знаете, glTranslate и glRotate всегда относятся к текущему состоянию матрицы. Например, если вы вызываете glTranslate, вы переводите из текущей "позиции" матрицы, а не из начала координат. Но если вы хотите начать с начала координат, когда вы вызываете glLoadIdentity(), а затем вы можете glTranslate из матрицы, которая теперь находится в начале координат, или glRotate из матрицы, которая теперь ориентирована в по умолчанию.

Я думаю, что Бун отвечает, что это эквивалент 1, не совсем правильный. Матрица выглядит так:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Это единичная матрица. Бун правильно, математически, что любая матрица, умноженная на эту матрицу (или матрица, которая выглядит так: диагональные, все остальные 0), приведет к исходной матрице, но я не верю, что он объяснил, почему это важно.

Причина, по которой это важно, заключается в том, что OpenGL умножает все позиции и вращения по каждой матрице; поэтому, например, вы рисуете многоугольник (glBegin(GL_FACE), некоторые точки, glEnd()), он переводит его в "пространство мира", умножая его на MODELVIEW, а затем переводит его из 3D в 2D, умножая его на PROJECT матрицу, и это дает ему 2D-точки на экране, а также глубину (с экрана "камера" ), которую он использует для рисования пикселей. Но когда одна из этих матриц является единичной матрицей, точки умножаются на единичную матрицу и поэтому не изменяются, поэтому матрица не имеет эффекта; он не переводит точки, он не вращает их, он оставляет их как есть.

Надеюсь, это еще раз пояснит!

Ответ 2

Идентификационная матрица эквивалентна 1 для числа. Как вы знаете, любое число, которое умножается на 1, само по себе (e.g. A x 1 = A),

То же самое относится к матрице ( MatrixA x IdentityMatrix = MatrixA).

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

glMatrixMode(GL_PROJECTION): относится к матрицам, используемым для преобразования перспективы или ортогонального преобразования.

glMatrixMode(GL_MODELVIEW): относится к матрицам, используемым при преобразовании модели. То есть, чтобы преобразовать ваш объект (aka model) в пространство координат представления (или пространство камеры).

Ответ 3

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

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

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

Что касается модели имени модели, она связана с двойственностью моделирования и просмотра. Если вы нарисуете камеру на 5 единиц назад или переместите объект на 5 единиц вперед, это будет по сути одинаковым.

Надеюсь, что я пролил свет.

Ответ 4

Идентификационная матрица используется для "инициализации" матрицы стандартным значением по умолчанию.

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

Ответ 5

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