ВЕРШИНИ У 3D – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

Ви дізналися, що у вершини є кілька атрибутів: позиція колір (необовязково) координати текстури (необовязково)

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

Vertices3: зберігаємо 3D-координати

Напишемо новий клас, який називається Vertices3, щоб працювати з тривимірними координатами Він буде заснований на оригінальному класі Vertices У лістингу 101 показаний його код

Лістинг 101 Клас Vertices3java – координат стало більше

Тут практично нічого не змінилося у порівнянні з класом Vertices, за винятком чотирьох невеликих фрагментів У конструкторі значення vertexSi ze тепер розраховується по-іншому, оскільки позиція вершини має три координати, а не дві У методі bind ми за допомогою виклику методу gl VertexPoi nter (перший аргумент) повідомляємо OpenGL ES, що вершини мають три координати, а не дві Ми також збільшуємо зсув, значення якого встановлюється у виклику методу verti ces posi ti on, для необовязкових компонент, таких як колір і координати текстури

Це все, що нам потрібно зробити Використання класу Verti ces3 дозволяє визначати х-, у-і z-координати кожної вершини при виклику методу Verti ces3, setVerti ces Все інше залишається точно таким же У нас можуть бути задані кольору для кожної вершини, а також координати текстур, їх індекси і т д

&nbsp

Приклад

Напишемо простий приклад, який називатиметься Vertices3Test Ми хочемо намалювати два трикутника, у одного координата z кожної вершини дорівнюватиме -3, а в іншого – 5 Ми також визначимо колір кожної вершини Оскільки ми ще не обговорювали використання перспективної проекції, будемо застосовувати ортографической проекцію з такими ближньої і дальньої площинами відсікання, що трикутники будуть знаходитися в області видимості (наприклад, ближня дорівнює 10, а далека – 10) Сцена показана на рис 101

Рис 101 Червоний трикутник (спереду) і зелений трикутник (ззаду) у тривимірному просторі

Червоний трикутник розташовується перед зеленим Ми можемо вжити слово перед, оскільки камера розміщується на початку координат і в OpenGL ES за замовчуванням спрямована уздовж негативній частині осі z (цієї інформації немає в довідковій статті про камері) Зелений трикутник також трохи зміщений вправо таким чином, щоб ми могли бачити його фрагмент, коли камера дивиться на сцену спереду Більша його частина повинна перекриватися червоним трикутником У лістингу 102 приведений код отрисовки цієї сцени

Лістинг 102 Vertices3TestJava: малюємо два трикутника

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

У класі Verti ces3Screen присутній член Vertices3, який ініціалізується в конструкторі Всього є шість вершин, кожна з яких має колір і не має текстурних координат Оскільки жоден трикутник не має загальних вершин з іншим, ми не будемо використовувати індексовані геометрії Ця інформація передається конструктору Verti ces3 Далі встановлюємо координати вершин за допомогою виклику методу Verti ces3 setVertices Перші три рядки визначають червоний трикутник, розташований спереду, а останні три рядки описують зелений трикутник, розташований ззаду і зміщений управо на 0,5 одиниці Третій параметр в кожному рядку – це координата відповідної вершини по осі р

У методі present, як і зазвичай, очищаємо екран і встановлюємо область видимості Далі завантажуємо матрицю ортографической проекції, встановлюємо оглядається область досить великий для того, щоб вся сцена помістилася на екран Нарешті, просто отрісовиваємих два трикутника, що знаходяться всередині екземпляра класу Vertices3 На рис 102 показаний результат роботи цієї програми

Рис 102 Два дивних трикутника

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

OpenGL ES буде малювати трикутники в тому порядку, в якому вони визначені в екземплярі класу Verti ces3 Оскільки перший визначений червоний трикутник, він і буде намальований перший Щоб це виправити, можна змінити порядок трикутників Але що якщо камера буде располалагться, наприклад, ззаду Нам знову доведеться сортувати трикутники перед їх отрисовкой, тому таке рішення не підходить Це можна легко виправити Для початку позбудемося орто-графічної проекції і будемо використовувати перспективну

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

*

*