ТРЮКИ ПРИ РОЗРОБЦІ 3D ІГОР – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

3D-програмування – це дуже складне і широке поле діяльності Розглядаються теми, які є мінімальними вимогами до програміста, який бажає написати просту 3D-Hrpy

Ми знову розглянемо наш знайомий вектор і приєднаємо до нього ще одну координату

Освітлення – це важлива частина будь тривимірної гри Ми вивчимо, як реалізувати просте освітлення за допомогою OpenGL ES

Визначення обєктів програмно виглядає досить громіздко Ми розглянемо простий формат 3D-файлів, за допомогою якого можна завантажувати і малювати 3D-моделі, створені за допомогою ПО для 3D-моделювання Почнемо з 3D-векторів

ПЕРЕД СТАРТОМ

Як звичайно, ми створимо кілька простих прикладів Щоб це зробити, ми просто створимо новий проект і скопіюємо весь вихідний код фреймворка, який розробили раніше

У нас буде єдина початкова активність, що надає нам доступні тести у вигляді списку Ми назвемо її GLAdvancedStarter і зробимо її активністю, яка використовується за замовчуванням Просто скопіюємо активність під назвою GL3DBasi csStarter і замінимо імена класів тестів Нам також знадобиться додати кожну з тестових активностей у відповідний елемент маніфесту

Як і колись, кожен тест буде розширювати можливості класу GLGame код буде створений як клас GLScreen, повязаний з примірниками класу GLGame Для економії місця я буду приводити лише найважливіші фрагменти класу GLScreen Всі тести і початкова активність знаходитимуться в пакеті com badl ogi с androi dgames gl advanced Деякі класи стануть частиною нашого фреймворка і увійдуть у відповідні пакети фреймворків

ВЕКТОРИ У 3D

Ми обговорили вектори та їх інтерпретацію в двомірному просторі Як ви могли здогадатися, всі розглянуті нами моменти також будуть працювати і в 3D Все, що потрібно зробити, – додати лише ще одну координату до вектора, яка буде називатися z-координатою

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

Додавання тривимірних векторів виглядає наступним чином:

Віднімання працює точно так само:

Множення вектора на скалярний значення проводиться так:

Вимірювання довжини тривимірного вектора – також нескладна операція ми просто додаємо координату по осі z до рівняння Піфагора:

Грунтуючись на цьому, ми можемо нормалізувати вектори до одиниці вимірювання довжини:

Позиції записуються у вигляді нормальних координат вектора х, у і z

Швидкості і прискорення також представляються як 3D-вектори Кожен компонент є певною кількістю атрибута по одній осі, наприклад метри в секунду для швидкості або метри на секунду в квадраті, якщо мова йде про прискорення

Відстані можна виміряти наступним чином – з координат кінця вектора потрібно відняти координати початку, а потім виміряти результуючу довжину вектора

Ще одна операція, яка може виявитися корисною, – обертання 3D-вектора навколо 3D-oceft Раніше ми вже використовували цей принцип за допомогою методу OpenGL ES gl Rotatef Однак не можна застосовувати цей принцип для того, щоб повернути вектор, що містить позиції або напряму ігрових обєктів, оскільки він працює тільки для вершин, які ми відправляємо в GPU На щастя, в Android API є клас Matri х, дозволяє емулювати вплив OpenGL ES на GPU Напишемо клас Vector3, який реалізує всі ці особливості Його код приведений в лістингу 111, я буду пояснювати його в міру необхідності

Лістинг 111 Клас Vector3java аналог класу Vector в 3D

Клас починається з оголошення декількох статичних масивів чисел з плаваючою крапкою Вони знадобляться далі для реалізації нового методу rotate класу Vector3 Просто запамятайте, що член matri х містить 16 елементів, а члени inVec і outVec – 4 елементи

Члени х, у і z, певні далі, говорять самі за себе Вони зберігають компоненти вектора:

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

Різноманітні методи add, subO і mul Про є розширенням однойменних методів, які були присутні в класі Vector2 Додана всього одна нова координата – z Дані методи реалізують ті особливості, які ми розглянули кілька сторінок тому Досить прямолінійно, чи не так

Методи також практично повністю копіюють однойменні методи класу Vector2 Все, що ми зараз зробили, – додали нову координату в розрахунки

А ось і новий метод rotate Як було зазначено раніше, він використовує клас Matri х з Android API Цей клас складається в основному з декількох статичних методів зразок Matrix, set I dentityM або Matri xrotateMO Вони працюють з масивами чисел з плаваючою точкою на зразок тих, що ми визначили раніше Матриця зберігається як 16 чисел з плаваючою точкою, а вектор повинен мати чотири елементи Я не буду вдаватися в подробиці, описуючи внутрішню роботу класу Все, що нам потрібно, – це спосіб емулювати можливості матриці OpenGL ES за допомогою Java Даний клас пропонує саме те, що нам необхідно Всі його методи працюють з матрицями і роблять це так само, як і методи OpenGL ES gl Rotatef, gl Transl atef або glIdenti tyf

Цей метод починається з установки компонента вектора, використовується масив i nVec, визначений нами раніше Далі викликається метод Matriх set Identi tyM для члена matrix нашого класу Це його очистить За допомогою OpenGL ES ми використовуємо метод glIdenti tyf, щоб виконати те ж саме з матрицями, які залишаються в GPU Далі викликається метод MatrixrotateMO Як аргумент він приймає масив чисел з плаваючою точкою, зсув для цього масиву, кут в градусах, на який необхідно повернути вектор, а також вісь, навколо якої слід здійснити поворот Цей метод еквівалентний методу gl Rotatef Він примножить задану матрицю на матрицю повороту Нарешті, ми викликаємо метод Matrix, mul tiplyMVC, який примножить вектор, що зберігається в масиві inVec, на matrix Це застосує до вектора всі перетворення, збережені в члені matri х Результат буде поміщений в outVec Залишок методу просто отримує нові компоненти вектора з масиву outVec і зберігає їх у членах класу Vector3

ПРИМІТКА

Ви можете використовувати клас Matrix не тільки для того, щоб повертати вектори Він працює з переданими матрицями точно так само, як і OpenGL ES

І нарешті, ми бачимо звичні методи dist і distSquared, які розраховують відстань між двома векторами в 3D

Зверніть увагу, метод anglе я скопіював без змін з класу Vecto г 2 У той час, як можливо виміряти кут між двома векторами в 3D, ми все одно не отримаємо значення в проміжку від 0 до 360 Зазвичай ми вимірюємо кут між двома векторами на площинах ху, zy і xz, використовуючи тільки два компоненти кожного вектора і застосовуючи метод Vector2 angleC

Думаю, ви погодитеся, що нам не потрібно розглядати приклад використання цього класу Ми можемо просто викликати його так само, як ми це робили з класом Vector2 Перейдемо до наступної теми: освітлення в OpenGL ES

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

*

*