ЗНОВУ МАТРИЦІ І ПЕРЕТВОРЕННЯ – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

Ми вже трохи говорили про матрицях Згадаймо деякі їх властивості: матриця переносить точки (або в нашому випадку – вершини) на нову позицію Це досягається множенням матриці на позицію точки матриця може переносити точки на кожній осі на деяке значення матриця може масштабувати точки Це означає, що кожна координата точки множиться на деяку константу матриця може повернути точку навколо осі множення одиничної матриці на точку не вплине на цю точку результатом множення однієї матриці на іншу є нова матриця Множення точки на цю нову матрицю призведе до застосування до точки обох перетворень, закодованих до оригінальної матриці

Множення матриці на одиничну матрицю не вплине на саму матрицю

OpenGL ES надає три типи матриць

Матриця проекцій Використовується для установки форми і розміру вікна перегляду Ці параметри керують типом проекції і тим, яка частина світу буде показуватися користувачеві

Модельно-видова матриця Застосовується для перетворення моделей в модельному просторі, а також для розміщення моделі в просторі світу

Матриця текстур Знову не звертаємо на неї уваги, оскільки з нею не можна коректно працювати на багатьох пристроях

Тепер, коли ми працюємо в тривимірному просторі, у нас є набагато більше налаштувань Наприклад, ми можемо не тільки повертати модель навколо осі z, як ми це робили з Бобом, але і навколо будь-якої осі Єдине важлива зміна – це поява додаткової z-осі, яку також можна використовувати для розміщення обєктів Насправді ми вже працювали в 3D раніше, коли малювали Боба ми просто ігнорували z-вісь Тепер ми можемо здійснити і більш масштабні задуми

Матричний стек

До цього моменту ми використовували матриці в OpenGL ES приблизно так:

Перша інструкція встановлює поточну активну матрицю Усі наступні операції з матрицями будуть зроблені над цією матрицею У цьому випадку в якості активної матриці встановлюється одинична матриця, яка потім множиться на матрицю ортографической проекції Подібне ми вже робили з видовою матрицею:

У цьому фрагменті коду дії проводяться над модельно-видової матрицею Спочатку завантажується одинична матриця для того, щоб очистити модельно-видову матрицю перед викликом Далі ця матриця множиться на матрицю перенесення і матрицю повороту Важливо зберегти саме такий порядок множення, оскільки він визначає порядок застосування перетворень до вершин мереж Останнє певне нами перетворення буде застосовано до вершин в першу чергу У попередньому випадку ми спочатку повертаємо кожну вершину на 45 ° навколо осі у Далі всі вершини переміщаються уздовж осі 2 на -10 одиниць

В обох випадках всі перетворення були закодовані в одній матриці: або матриці проекцій, або видовий матриці Але виявляється, що для кожного типу матриць існує цілий стек матриць, який можна використовувати

В даний момент ми застосовуємо лише один елемент цього стека: вершину стека (НД) НД стека матриць застосовується в OpenGL ES для перетворення вершин, незалежно від того, чи йде мова про проекційної матриці або модельно-видової матриці Будь матриця, що розташовується нижче НД, не робить ніякого впливу на точки, очікуючи, поки вона не стане НД Як же управляти цим стеком

У OpenGL ES є два методи, за допомогою яких можна помістити в стек або виштовхнути з нього поточну НД:

Аналогічно методу g1Trans1atef і подібним йому ці методи завжди працюють з поточним активним матричним стеком, який встановлюється за допомогою методу gMatri xMode

Метод gl PushMatri х приймає поточну НД, копіює її Метод gl PopMatri х приймає поточну НД і піднімає її, видаляючи вершину з стека Після цього елемент, що знаходиться під вершиною, стає новою ВС Метод gl PopMatri х приймає поточну НД і виштовхує її з стека Напишемо невеликий приклад:

До цього моменту в стеку видових матриць існувала всього одна матриця Збережемо її:

Тепер ми зробили копію поточної НД і змістили вниз попередню НД У нас в стеку тепер є дві матриці, кожна з яких кодує паралельний перенос по осі z на -10 одиниць

Оскільки матричні операції завжди працюють з НД, тепер у верхній матриці закодовані операції масштабування, повороту та паралельного переносу Матриця, яку ми змістили вниз, як і раніше містить лише операцію паралельного перенесення При отрісовке мережі, заданої в просторі моделей, на зразок нашого куба, спочатку вона буде масштабувати по осі у, потім повернута по осі у, а потім перенесена на -10 Одиниць по осі z Виштовхніть з стека його вершину:

Ця дія видаляє НД, а матриця під нею стає новою НД У нашому прикладі такою є оригінальна матриця переносу Після виклику цього методу в стеку знову знаходиться тільки одна матриця – та, яку ми ініціалізували на самому початку прикладу Якщо обєкт буде відмалювали зараз, він буде лише перенесене на -10 одиниць по осі z Матриці, що містить операції масштабування, повороту і перенесення, більше не існує, оскільки вона була виштовхнута з стека На рис 1013 показано, що станеться зі стеком матриць при виконанні попереднього коду

Рис 1013 Маніпуляції з матричним стеком

Для чого можна використовувати матричний стек Перше, для чого він може бути використаний, – запамятовування перетворень, які повинні бути застосовані для всіх обєктів світу Припустимо, ми хочемо, щоб все обєкти світу мали зсув на 10 одиниць по кожній осі Ми можемо зробити наступне:

Цей шаблон ми використовуємо і далі, коли будемо обговорювати створення системи камер в 3D Позиція камери і її орієнтація часто кодуються у вигляді матриці Ми завантажимо цю матрицю камери, яка перетворює всі обєкти так, щоб ми змогли побачити їх з позиції камери Однак є дещо краще матричного стека

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*