Что делает glLoadIdentity () в OpenGL? - PullRequest
127 голосов
/ 10 марта 2009

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

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

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

Ответы [ 5 ]

134 голосов
/ 10 марта 2009

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

Как вы, наверное, знаете, 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 точки на экране, а также глубину (от экрана «камера»), которую он использует для рисования пикселей. Но когда одна из этих матриц является единичной матрицей, точки умножаются на единичную матрицу и, следовательно, не изменяются, поэтому матрица не действует; он не переводит точки, он не вращает их, он оставляет их как есть.

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

39 голосов
/ 10 марта 2009

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

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

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

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

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

6 голосов
/ 08 мая 2013

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

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

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

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

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

2 голосов
/ 10 марта 2009

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

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

0 голосов
/ 27 марта 2018
Функция

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

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