Перевірка перетину обмежують сфер – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Математика розрахунків зіткнень мереж трикутників або обмежують паралелепіпедів може бути досить заплутаною Для нашої наступної гри відмінно підійдуть обмежують сфери Існує простий прийом, який ми вже застосували в грі Великий стрибун: щоб сфери більш вдало вписувалися, ми зробимо їх менше, ніж графічне представлення певних обєктів На рис 1113 показана сфера космічного корабля

Рис 1113 Зменшуємо обмежує сферу для того, щоб вона краще вписувалася в обєкт

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

Як же ми зіштовхнемо дві сфери один з одним Кажучи іншими словами, як ми перевіримо, що сфери перетинаються Це можливо визначити точно так само, як і у випадку з колами Все, що нам потрібно, – виміряти відстань від центру однієї сфери до центру іншої сфери Якщо воно менше, ніж сума радіусів цих сфер – значить, ці сфери зіткнулися Створимо простий клас Sphere (лістинг 1114)

Лістинг 1114 Клас Spherejava, проста обмежує сфера

Цей код точно такий же, що і в класі Circlе Ми змінили лише вектор, який зберігає координати центру Тепер він є екземпляром класу Vector3, а не Vector2

Розширимо також клас OverlapTester методами, перевіряючими перетин двох сфер і наявність точки всередині сфери Його код міститься в лістингу 1115

Лістинг 1115 Фрагменти класу OverlapTesterJava, додаємо методи для тестування сфер

Знову ж цей код в точності повторює аналогічний код класу Ci rcl е Ми просто змінили тип центру сфер на Vector3

ПРИМІТКА

Цілі і присвячені визначенню зіткнень тривимірних обєктів Якщо ви хочете зануритися в цей цікавий світ, я запропоную вам у Визначення зіткнень в реальному часі (Real-time Collision Detection), написану Крістером Еріксоном (Christer Ericson) і випущену видавництвом Morgan Kaufmann в 2005 році Вона повинна бути на книжковій полиці будь-якого поважаючого себе розробника ігор

Класи GameObject3D і DynamicGameObjectSD

Тепер, коли ми визначили обмежуючу фігуру для 3D-обєктів, ми з легкістю можемо написати еквіваленти класів GameObject і DynamicGameObject, використаних в 2D Ми просто замінимо всі примірники класу Vector2 на екземпляри класу Vector3 і будемо застосовувати клас Sphere замість класу Rectangle У лістингу 1116 показаний код класу Game0bject3D

Лістинг 1116 Клас Game0bject3D уявлення простого обєкта, що має позицію і кордони

Цей код дуже тривіальний, можливо, вам взагалі не знадобиться його пояснювати Єдиний недолік полягає в тому, що нам доводиться зберігати однакову позицію двічі: один раз як член position класу GameObject3D і другий – всередині члена position екземпляра класу Sphere, що міститься в класі GameOb ject3D Це дещо неелегантно, але для ясності ми будемо дотримуватися цієї поведінки

Успадкувати клас DynamicGame0bject3D від цього класу досить просто Код представлений в лістингу 1117

Лістинг 1117 Клас DynamicGame0bject3Djava, динамічний аналог класу Game0bject3D

Знову ж замінюємо екземпляри класу Vector2 на екземпляри класу Vector3 і щасливо посміхаємося

У 2D нам доводилося думати про відносини між графічним представленням наших обєктів (заданим в пікселах) і одиницями вимірювання всередині моделі нашого світу У 3D ми вільні від цього Вершини наших 3D-моделей, які ми завантажуємо з, наприклад, OBJ-файлу, можуть бути визначені в будь вимірювальній системі Нам більш не потрібно перетворювати пікселі в одиниці виміру світу і навпаки Це спрощує роботу в 3D Нам потрібно лише навчити нашого художника малювати такі моделі, які добре масштабуються до вимірювальної системи нашого світу

Підводячи підсумок

Знову ми розглянули безліч таємниць зі світу програмування ігор Ми трохи поговорили про вектори в 3D, які, як виявилося, так само прості, як і їхні побратими в 2D Загальна ідея: ми просто додали координату по осі z Ми також розглянули освітлення в OpenGL ES Написали допоміжні класи, необхідні для подання матеріалів і джерел освітлення, з їх допомогою досить просто можна встановити освітлення на сцені Для кращої продуктивності і скорочення кількості графічних артефактів реалізували mip-текстурирование як частина класу Texture Вивчили реалізацію простих камер з видом від першої і від третьої особи, написавши зовсім небагато коду і скориставшись класом Matri х Оскільки створення 3D-мереж вручну в коді утомливо, ми також розглянули один з найбільш простих і популярних форматів 3D-файлів: Wavefront OBJ Ми знову розглянули стару фізичну модель і перенесли її в тривимірну реальність, це виявилося так само просто, як і створення 3D-векторів Останнім пунктом нашого плану була робота з обмежуючими фігурами та поданням обєктів в 3D Враховуючи наші скромні потреби, ми вибрали дуже прості рішення для обох проблем, які практично ідентичні тим, що ми використовували в 2D

Хоча я міг би представити ще багато аспектів, повязані з написанням ігор в 3D, тепер ви маєте уявлення про те, як написати тривимірну гру Секрет реалізації полягає в тому, що немає особливої ​​різниці між 2D та 3D-грою (звичайно, якщо не сильно все ускладнювати) Більш нам не варто боятися 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>

*

*