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


132

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

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

Также немного смущен о glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Ответы:


139

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

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

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

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

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

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

Надеюсь, это проясняет немного больше!


1
Это означает, что OpenGL поддерживает «главную» или «глобальную» матрицу, и каждая последующая матрица применяется относительно этой «главной» или «глобальной» матрицы. Я прав?
user366312

41

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

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

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

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

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


6

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

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

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

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

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


2

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

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


0

Чтобы повторить то, что говорили другие, единичная матрица - это матрица, которая такова, что когда вы умножаете на нее вектор / матрицу, результатом является тот же самый вектор / матрица. Это эквивалент числа 1 с умножением или числа 0 с добавлением.

glLoadIdentity () является устаревшей функцией, и вам рекомендуется управлять своими собственными матрицами.


-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.