Куб: Hello World в 3D – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

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

Перше, що необхідно визначити для куба, – кутові точки На рис 1010 показаний куб зі стороною, що дорівнює одній одиниці виміру (наприклад, 1 м) Я також трохи розібрав цей куб для того, щоб ви могли бачити окремі грані, кожна з яких створена з двох трикутників У реальності всі грані зійдуться на кордонах куба, визначених його кутовими точками

Рис 1010 Куб і його кутові точки

Куб має шість граней, кожна з яких складається з двох трикутників Два трикутника кожній грані мають по дві загальні вершини Наприклад, для передній грані куба загальними є вершини з координатами (-0,5 0,5 0,5) і (0,5 -0,5 0,5) Для кожної грані необхідно визначити чотири вершини, для всього куба виходить 6-4 = 24 вершини Однак нам потрібно визначити 36 індексів, а не 24 Це необхідно тому, що всього є 6 х 2 трикутника, кожен з яких використовує 3 з 24 вершин Ми можемо створити мережу для цього куба, використовуючи індексацію вершин, як показано в цьому сніпеті:

У цьому фрагменті коду визначаємо лише позиції вершин Починаємо з передній грані, її нижня ліва вершина знаходиться в точці з координатами (-0,5 -0,5 0,5) Далі визначаємо наступні три вершини цієї грані, рухаючись проти годинникової стрілки Наступною буде права грань куба, за нею задня, ліва, верхня і нижня Всі вони визначаються за заданим шаблоном Порівняйте визначення вершин з рис 1010

Далі визначаємо індекси Усього є 36 індексів – кожен рядок наведеного коду визначає два трикутника, кожен з яких складається з трьох вершин Індекси (0,1,3,1,2,3) задають передню грань куба, наступні три – ліву грань і т д Порівняйте ці індекси з вершинами, показаними в коді, а також з рис 1010

Після визначення всіх вершин та індексів ми можемо зберегти їх в екземплярі класу Verti ces3 для подальшої отрисовки, що ми і робимо в останніх кількох рядках цього сниппета

Що щодо координат текстур Просто додайте їх до визначення координат Припустимо, що у нас є текстура розміром 128 х 128, що містить зображення однієї грані ящика Ми хочемо використовувати цю текстуру для кожної грані куба На рис 1011 показано, як ми можемо зробити це

Рис 1011 Координати текстур для кожної з вершин передній, лівій і верхній граней (це ж вірно і для інших граней)

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

Звичайно, необхідно вказати екземпляру класу Vertices3, що він містить і координати текстур:

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

Приклад

Ми хочемо створити мережу для куба, показану в попередніх прикладах коду, і застосувати текстуру ящика Оскільки куб моделюється в просторі моделей, розташованому навколо початку його координат, нам доведеться використовувати метод gl Transl atef для того, щоб перемістити його в простір створюваного світу так само, як ми вчинили з моделлю Боба в прикладі BobTest Крім того, ми хочемо, щоб наш куб обертався навколо осі у Цього ми можемо досягнути за допомогою методу gl Rotatef, що ми також робили в прикладі BobTest У лістингу 106 наведено повний код класу CubeScreen, що міститься в класі CubeTest

Лістинг 106 Фрагменти класу CubeTestjava: отрисовка текстур куба

У нас є поле для зберігання мережі куба, екземпляр класу Texture, а також змінна, має тип числа з плаваючою точкою, для зберігання поточного кута повороту У конструкторі ми створюємо мережу куба і завантажуємо текстуру з файлу активу, який називається crate png, текстуру, що має розміри 128 х 128 пікселів, що представляє собою зображення однієї грані ящика

Код, що створює куб, знаходиться в методі createCube У ньому просто встановлюються вершини і індекси, а потім з них створюється екземпляр класу Verti ces3 Кожна вершина має позицію в тривимірному просторі і координати текстури

Метод resume просто повідомляє текстурі, що їй необхідно перезавантажитися Памятайте, текстури необхідно перезавантажувати всякий раз, коли втрачається контекст OpenGL ES

Метод update Про збільшує кут повороту, на який куб буде повернутий по осі у

Метод present спочатку встановлює вікно відображення, а також очищає буфери кольору і глибини Далі встановлюється перспективна проекція і в видову матрицю OpenGL ES завантажується одинична матриця Ми дозволяємо перевірку глибини і текстурування, привязуємо текстуру, а також мережа куба Далі використовується метод gl Translatef для того, щоб пересунути куб в точку з координатами (0, 0, -3) простору світу За допомогою методу gl Rotatef (Повертаємо куб в просторі моделей навколо осі у Памятайте, що порядок, в якому перетворення застосовуються до мережі, є зворотним Куб спочатку буде повернутий (У просторі моделей), а потім його повернена версія буде розміщена в просторі світу Нарешті, ми малюємо куб, прибираємо привязку mesh і відключаємо перевірку глибини і текстурирование Немає необхідності відключати ці стани Я виконав це тільки для того, щоб надалі ми змогли отрісовать двомірні елементи на верху тривимірної сцени На рис 1012 показаний результат роботи нашої першої цієї 3D-програми

Рис 1012 Обертова текстура куба в 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>

*

*