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

&nbsp

Ми говорили про два способи створення камери Перший з них, Ейлерова камера, був схожий на той, який використовується в шутерах від першої особи Другий, камера з видом від третьої особи, застосовується для роботи кінематичної камери або для проходження за обєктом Створимо два допоміжних класу, які в подальшому можна буде задіяти в наших іграх

Камера з виглядом від першої особи (Ейлерова камера)

Камера з виглядом від першої особи (Ейлерова камера) визначається наступними атрибутами: поле огляду в градусах співвідношення сторін області перегляду ближня і дальня площині відсікання позиція в 3D-просторі кут повороту навколо осі у кут повороту навколо осі х Він обмежений і лежить в проміжку між -90 і 90 ° Подумайте про те, як далеко ви зможете нахилити вашу голову, і спробуйте вийти за ці межі За будь-які можливі травми я відповідальності не несу

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

Інші три атрибута визначають позицію і орієнтацію камери в нашому світі

Помістимо все це в простий клас Його код показаний в лістингу 119

На додаток ми хочемо пересувати камеру в тому напрямку, в якому вона спрямована Для цього нам знадобиться одиничний вектор, яким ми зможемо додати до вектора позиції камери Ми можемо створити такий вектор за допомогою класу Matrix, який надається в Android API Трохи подумаємо про це

У своїй конфігурації за замовчуванням наша камера буде дивитися вздовж негативній частині осі z Тому вектор її напрямки дорівнює (0, 0, -1) Коли ми визначимо кути повороту навколо осей х або у, цей вектор буде відповідно повернуть Для визначення вектора напрямки нам лише потрібно помножити його на матрицю, яка поверне стандартний вектор так само, як OpenGL ES поверне вершини наших моделей

Погляньмо на те, як все це працює в коді У лістингу 119 показаний код класу EulerCamera

Лістинг 119 Клас EulerCameraJava, проста камера з видом від першої особи, заснована на ейлерову кутах навколо осей х і у

Перші три члени зберігають позицію і кути повороту камери Решта чотири члени використовуються для розрахунку матриці перспективної проекції За замовчуванням камера розташовується на початку координат і дивиться вздовж негативній частині осі z

Конструктор приймає чотири параметри, що визначають перспективну проекцію Ми залишаємо значення за замовчуванням для позиції камери і кутів її повороту

Ці методи просто повертають орієнтацію камери і її позицію

Метод setAngles дозволяє нам безпосередньо встановлювати значення кута повороту камери Зверніть увагу на те, що ми обмежуємо значення кута повороту по осі х проміжком від -90 до +90 Ми не можемо повернути власну голову більше, ніж на ці градуси, тому камера теж не повинна цього робити

Метод rotateO практично ідентичний методу setAnglesO Замість установки градусів він збільшує їх на значення параметра Це буде корисно, коли ми в наступному прикладі реалізуємо невелику схему управління, засновану на дотиках до екрану

Метод setMatrices просто ініціалізує проекційну і модельно-видову матриці так, як ми говорили раніше Проекційна матриця встановлюється за допомогою методу gluPerspective, грунтуючись на параметрах, переданих камері в конструкторі Модельно-видова матриця виконує прийом Магомет – гора, застосовуючи поворот і паралельне перенесення на осі х і у Всі фактори, включені в цю дію, змінюють свій знак на мінус, щоб досягти того, щоб камера залишалася на початку координат і спрямовувалася уздовж негативній частині осі р Саме тому ми повертаємо і паралельно переносимо обєкти навколо камери Інших способів немає

Нарешті, ми бачимо таємничий метод getDirection Він містить кілька членів, які використовуються для розрахунків усередині методу Завдяки цьому ми не створюємо нові масиви чисел з плаваючою точкою і екземпляри класу Vector3 кожен раз, коли викликається цей метод

Розглядайте ці члени класу як тимчасові робочі змінні Усередині методу ми спочатку встановлюємо матрицю перетворень, що містить інформацію про те, що необхідно виконати поворот навколо осей х і у Нам не потрібно включати туди паралельне перенесення, оскільки нам необхідно створити вектор напрямку, а не позиції Напрямок камери не залежить від її позиції у світі Методи класу Matrix говорять самі за себе Єдиний дивний аспект – ми викликаємо ці методи в зворотному порядку, не змінюючи знак їх аргументів Протилежне відбувається при виклику методу setMatrices, це досягається за рахунок того, що тепер ми застосовуємо перетворення до точки точно так само, як і до віртуальної камері, яка не обовязково повинна розміщуватися на початку координат і спрямована в бік негативній частині осі z Повертаємо вектор має координати (0, 0, -1) і зберігається у змінній inVec Цей напрямок камери за умовчанням, якщо вона не була повернута Всі вироблені нами маніпуляції з матрицями – це поворот вектора напряму на кути pitch і roll, тому вона вказує в тому ж напрямку, що і камера Останнє, що нам потрібно зробити, – встановити значення екземпляра класу Vector3, грунтуючись на результаті перемноження матриці і вектора і повернути його викликає функції

Ми можемо використовувати цей одиничний вектор напрямку і надалі для того, щоб перемістити камеру в тому напрямку, куди вона повернена

За допомогою невеликого допоміжного класу ми напишемо маленьку тестову програму, що дозволяє нам переміщатися в світі ящиків

Джерело: 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>

*

*