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

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

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

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

5 ответов


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

как вы, надеюсь, знаете, glTranslate и glRotate всегда относительно текущего состояния матрицы. Так, например, если вы вызываете glTranslate, вы переводите из текущей "позиции" матрицы, а не из источника. Но если вы хотите начать все сначала в origin, то именно тогда вы вызываете 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, умножая его на матрицу проекта, и это дает ему 2D-точки на экране вместе с глубиной (с экрана "камера"), которую он использует для рисовать пиксели. Но когда одна из этих матриц является матрицей тождества, точки умножаются на матрицу тождества и, следовательно, не изменяются, поэтому матрица не имеет никакого эффекта; она не переводит точки, она не вращает их, она оставляет их как есть.

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


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

то же самое касается matrix ( MatrixA x IdentityMatrix = MatrixA).

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

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

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


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

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

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

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

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


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

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


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