ПЕРСПЕКТИВНАЯ ПРОЕКЦІЯ: БЛИЖЧЕ, БІЛЬШЕ – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

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

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

Рис 103 Перспективна область видимості, що містить сцену (ліворуч), погляд зверху на область видимості (праворуч)

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

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

Відстані до ближньої і дальньої площин відсікання добре вам знайомі Нам просто необхідно встановити їх значення так, щоб в області видимості відображалася вся сцена Що таке поле зору, також легко зрозуміти, подивившись на праве зображення рис 103

Поняття співвідношення сторін вікна перегляду трохи складніше Навіщо потрібен цей параметр Він дозволяє переконатися, що наш Світ не розтягнеться, якщо співвідношення сторін екрану, який необхідно отрісовать, що не дорівнюватиме 1

Раніше ми використовували метод gl Orthof, щоб визначити ортографической область видимості у вигляді матриці проекцій Для перспективної області видимості можемо застосувати метод gl Frustumf Однак є й простіший спосіб

Зазвичай OpenGL поставляється з допоміжною бібліотекою, яка називається GLU Вона містить кілька допоміжних функцій для таких цілей, як установка значень матриці проекцій і реалізація систем камер Ця бібліотека також доступна на платформі Android, де вона має вигляд класу, який теж називається GLU Вона надає кілька статичних методів, які можна викликати без екземпляра класу GLU Метод, який нас цікавить в даний момент, називається gluPerspecti ve:

Цей метод перемножує поточну активну матрицю (наприклад, проекційну або модельно-видову) з матрицею перспективної проекції, як і метод gl Orthof Перший параметр – це екземпляр класу GL10, зазвичай той, який ми використовуємо для всіх інших завдань, повязаних з OpenGL ES Другий параметр – це поле зору, задане в кутах, третій параметр – співвідношення сторін вікна перегляду, а останні два параметри визначають відстань між позицією камери і ближньої, а також дальньої областями відсікання Оскільки у нас поки немає камери, ці значення задаються щодо початку координат світу, змушуючи нас дивитися в бік негативних значень координат осі 2, як і на рис 103 Це чудово підходить для наших цілей в даний момент Ми переконаємося, що всі обєкти, які ми отрісовиваємих, залишаться всередині фіксованою і нерухомою області видимості Поки ми іспользуемтолько метод gluPerspectiveO, ми не можемо змінити позицію або орієнтацію нашої віртуальної камери Ми завжди будемо бачити тільки ту частину світу, яка лежить вздовж негативною половини осі 2

Модифікуємо останній приклад так, щоб у ньому була використана перспективна проекція Я просто скопіював весь код з класу Verti ces3Test в новий клас, який називається Perspecti veTest, а також перейменував Vertices3Screen в Perspecti veScreen Єдине, що необхідно змінити, – метод present О У лістингу 103 показаний новий код цього методу

Лістинг 103 Фрагменти класу PerspectiveTestJava: перспективна проекція

Єдина відмінність від попереднього методу present полягає в тому, що тепер ми використовуємо метод GLU gl uPerspective замість gl OrthoO Ми застосовуємо поле зору, рівне 67 °, це значення близько до поля зору людського ока Збільшуючи або зменшуючи це значення, ви зможете відобразити більше обєктів зліва і справа Наступне, що ми визначаємо, – співвідношення сторін, яке дорівнює відношенню ширини екрану до його висоті Зверніть увагу на те, що воно є числом з плаваючою точкою, тому перед поділом нам доведеться перетворити ширину в тип f1oat Останні аргументи – це відстань між камерою і площинами відсікання Вважаючи, що наша віртуальна камера знаходиться на початку координат і спрямована в бік негативних значень по осі 2, всі обєкти, що мають координату по осі 2, меншу -0,1, Але більшу -10, будуть перебувати між ближній і дальній площинами відсікання і тому потенційно є видимими На рис 104 показаний результат роботи цього прикладу

Рис 104 Перспектива (в основному все вірно)

Тепер ми насправді займаємося ЗБ-графікою Як ви можете бачити, у нас все ще є проблема з порядком отрисовки трикутників Виправимо це за допомогою всемогутнього z-буфера

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

*

*