Що робить 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

Це матриця ідентичності. Бун правильно, математично, що будь-яка матриця, помножена на цю матрицю (або матриця, яка виглядає так; діагональні, всі інші 0), призведе до оригінальної матриці, але я не вірю, що він пояснив, чому це важливо.

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

Я сподіваюся, що це прояснить трохи більше!


1
Це означає, що OpenGL підтримує матрицю "Master" або "Global", і кожна наступна матриця застосовується відносно цієї "Master" або "Global" матриці. Маю рацію?
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.