Лекція № 5. Тривимірна графіка
Ця лабораторна робота присвячена основам роботи з тривимірною графікою. Тут ми поговоримо про тривимірної системі координат, про складові частини тривимірних об'єктів, про матричних обчисленнях, які використовуються в тривимірній графіці. Так само ми розглянемо відповідні частини об'єктної моделі XNA.
мета лекції
- Освоїти основи роботи з тривимірною графікою в XNA
завдання лекції
- Ознайомитися з правобічної системою координат.
- Ознайомитися з поняттям точки, вершини, вектора, полігону в тривимірному просторі.
- Ознайомитися із застосуванням світової, видовий і проекційної матриць.
- Ознайомитися з матричними перетвореннями в тривимірному просторі.
- Ознайомитися з концепціями освітлення об'єктів.
- Ознайомитися з найбільш важливими властивостями і методами об'єктів XNA, використовуваних при роботі з тривимірною графікою
Система координат
При роботі з тривимірною графікою використовується кілька видів систем координат. Для відображення двовимірних об'єктів нам була потрібна відповідна система координат з двома осями - горизонтальною віссю X і вертикальною віссю Y. Нагадаємо, що екранна система координат для двовимірної графіки має початок (точку 0,0) в лівому верхньому кутку монітора, позитивна частина осі X розташовується праворуч від початку координат, позитивна частина осі Y - знизу.
Для роботи з тривимірними об'єктами нам знадобиться ще одна вісь - вона називається вісь Z. Існує кілька варіантів тривимірних систем координат, зокрема, поширені так звані правобічна і лівостороння системи. Ми будемо користуватися правобічної системою - вона застосовується в XNA Framework. Її схематичне зображення наведено на рис. 5.1.
Мал. 5.1. Правобічна система координат
Особливість цієї системи координат полягає в тому, що початок координат можна зіставити з лівим нижнім кутом монітора, позитивна частина осі X знаходиться праворуч від початку координат, позитивна частина осі Y - зверху, а позитивна частина осі Z - спереду. А це означає, що видима частина осі Z - це її негативна частина. Ця частина осі перебуває ніби «в глибині монітора», в той час, як позитивна частина знаходиться «попереду монітора». На рис. 5.1. пунктиром зображена негативна частина осі Z.
У двовимірної системі координат існує поняття точки - її координати задаються двома значеннями - X і Y. Точки існують і в тривимірній системі координат - вони задаються вже трьома значеннями - X, Y, Z.
Точки використовують для того, щоб ставити координати вершин багатокутників (полігонів), зокрема - трикутників. Так, трикутник, зображений на рис. 5.1. заданий трьома крапками - A, B, C.
Як правило, більш складні тривимірні об'єкти будуються саме з трикутників.
У тривимірній графіці існує таке поняття, як грань (face). Це - плоский об'єкт, який визначають кілька вершин. У нашому випадку звичайний трикутник - це саме грань. З кількох плоских граней можна зібрати об'ємний об'єкт.
Чим більше трикутників використано при побудові моделі - тим більше деталізованої вона виходить. Точки, що відповідають вершинам трикутника, який можна зобразити у тривимірному просторі, називаються вершинами. Працюючи з тривимірною графікою в XNA вам часто доводиться зустрічати англійський варіант слова вершина - vertex. Можливо, вам зустрінеться множину слова вершина: «вершини» виглядає по-англійськи як «vertices». Іноді для позначення вершин використовують кальку з англійської - вертекс.
Трикутник не випадково була обрана в якості базової геометричної фігури - по-перше - цей багатокутник завжди є опуклим, по-друге - неможливо розташувати три точки таким чином, щоб вони не належали одній площині. Тобто, трикутник - це фігура, яка завжди є опуклою і плоскою, що дозволяє з успіхом використовувати його в цілях тривимірної графіки.
Кілька граней, з яких складається тривимірний об'єкт, називаються сіткою (mesh). "Сітка" являє собою набір трикутників.
Ще одне поняття, яке стане в нагоді вам при роботі з тривимірною графікою - це поняття вектора. Вектор (vector), так само як і точка, може бути визначений трьома параметрами, однак він описує не положення в просторі, а напрямок і швидкість руху.
Вектор має початок і кінець, для його повного визначення потрібно знати координати точки початку і кінця вектора, тобто, замість трьох значень координат нам знадобиться вже шість значень. Однак, якщо за замовчуванням прийняти за початок вектора початок координат (точку 0,0,0) - тоді для його визначення вистачить і трьох точок.
Наприклад, вектор з координатами (1,0,0) означає: «напрямок - вправо, швидкість - 1». Якщо відкласти цей вектор від початку координат, то добре видно, що він спрямований саме вправо (рис. 5.2.).
Напрямок вектора визначається положенням другої точки щодо першої (в нашому випадку - положення точки кінця вектора, якої задається вектор щодо початку координат), а швидкість - довжиною вектора - тобто - різницею між початковою і кінцевою точкою. У нашому випадку довжина вектора збігається з координатами його кінця.
Мал. 5.2. Вектор (1,0,0)
Існує особливий вид векторів - нормалі (normals). Нормалі можуть бути побудовані для граней і для вершин об'єкта. Нормалі для граней перпендикулярні цим гранях. Вони використовуються при розрахунку кольору об'єкта.
Перетворення в тривимірному просторі
Знаючи координати вершин полігонів, з яких складається об'єкт, ми можемо розташувати його в просторі. Тепер потрібно розібратися зі зміною положення об'єктів в просторі. Існує кілька основних операцій, які можуть використовуватися для переміщення об'єктів в тривимірному просторі. Це - переміщення (translation), обертання (rotation) і масштабування (scale).
Результати роботи графічної підсистеми тривимірної гри ми бачимо на плоскому екрані монітора - змодельована комп'ютером тривимірна сцена проектується на двовимірну поверхню. При проектуванні потрібно вибрати точку, яка виконує роль камери, що дозволяє бачити тривимірний простір. У свою чергу, об'єкти в тривимірному просторі можуть переміщатися відповідно до певних правил. Для управління всім цим використовуються кілька матриць. Це - світова матриця (World Matrix), матриця виду (View Matrix) і матриця проекції (Projection Matrix).
Матрицю можна представити у вигляді таблиці, що складається з m рядків і n стовпців. У комп'ютерній графіці застосовуються матриці 4х4. Перших три стовпці цієї матриці відповідають за модифікацію координат X, Y, Z вершин об'єкта, який бере участь в трансформації.
- Світова матриця дозволяє задавати перетворення - переміщення, обертання і трансформації об'єктів.
- Матриця виду дозволяє управляти камерою.
- Матриця проекції служить для настройки проекції тривимірної сцени на екран.
Припустимо, є трикутник, заданий наступними вершинами (табл. 5.1.).
Таблиця 5.1. Вершини трикутника до переміщення
Того ж ефекту можна досягти, помноживши координати кожної з вершин на світову матрицю. Для цього координати вершини представляють у вигляді матриці, що складається з одного рядка і чотирьох стовпців. У перших трьох стовпці містять координати X, Y, Z, в четвертому - 1. Світова матриця представлена у вигляді таблиці 4х4. Ось як виглядає операція множення матриць (формула 5.1.):
Формула 5.1. Множення матриці вершини і світової матриці
При перетворенні кожна з вершин множиться на світову матрицю.
Кожне з перетворень в просторі вимагає особливої настройки світової матриці. У формулі 5.2. наведено шаблон світової матриці, яка дозволяє переміщати об'єкти в просторі.
Формула 5.2. Світова матриця для переміщення об'єкта
Світова матриця для обертання об'єктів навколо осі Х виглядає так (формула 5.3.).
Формула 5.3. Світова матриця для обертання по осі Х
тут # 945; - кут повороту в радіанах
Світова матриця для обертання об'єктів по осі Y виглядає так (формула 5.4.)
Формула 5.4. Світова матриця для обертання по осі Y
Матриця для обертання об'єктів навколо осі Z приведена у формулі 5.5.
Формула 5.5. Світова матриця для обертання по осі Z
Формула 5.6. представляє матрицю, яка служить для трансформації об'єктів.
# 966; x. # 966; y, # 966; z - це коефіцієнти масштабування, які застосовуються до вершин. Вони дозволяють «стискати» або «розтягувати» об'єкти.
Освітлення об'єктів в іграх виконує ту ж роль, яка відведена йому в реальному світі. Існує безліч типів освітлення.- Навколишній розсіяне світло (ambient light) - це світло, яке освітлює всі об'єкти сцени з однаковою інтенсивністю. Джерело розсіяного світла не має місця розташування.
- Точкове джерело світла (point light) - це джерело, яке випромінює світло в усіх напрямках. Його можна порівняти зі світлом, що виходить від лампочки, не прикритої абажуром.
- Направлене джерело світла (directional light). Це джерело, на відміну від точкового, не має місця розташування, проте має орієнтацію
- Зональний джерело світла (spot light) або прожектор має місце розташування, орієнтацію, а його світловий потік обмежений у формі конуса.
Шейдери, або шейдерниє програми - це програми, які дозволяють застосовувати до моделей різні ефекти. Вони пишуться на спеціальній мові програмування, як правило, не вручну, а з використанням відповідного програмного забезпечення. Шейдери діляться на верхові і піксельні. Вершинні шейдери дозволяють застосовувати різні ефекти до вершин моделей, піксельні шейдери обробляють колір кожного з пікселів моделі перед виведенням її на екран.
Текстури - це растрові (двовимірні) зображення, які накладаються на тривимірні моделі. Наприклад, тривимірна модель автомобіля може являти собою автомобіль, який як би «вирізаний» з твердого матеріалу, а після накладення на цю модель відповідної текстури автомобіль набуває кольору, створюється ілюзія наявності у нього дрібних деталей оформлення і т.д. Мінімальна одиниця текстури називається тексель. Чим більше пікселів доводиться на один тексель, ніж большьше дозвіл текстури - тим більш якісною буде виглядати модель після накладення на неї текстури.
Об'єкти XNA для роботи з 3D-графікою
В об'єктній моделі XNA існує кілька об'єктів, які інтенсивно використовуються для роботи з тривимірною графікою.
Клас Matrix дозволяє створювати матриці, які використовуються для перетворень об'єктів в просторі, для управління камерою і проекцією тривимірної сцени на екран. Цей клас, який, як це зазвичай буває в NET Framework, є так само типом даних і містить статичні методи, використовувані для створення матриць. Як правило, доводиться, наприклад, «вручну» модифікувати світову матрицю для того, щоб організувати поворот або переміщення моделі - всі необхідні операції можна виконати за допомогою статичних методів класу Matrix, так само об'єкти класу Matrix мають безліч корисних властивостей. Розглянемо деякі з них.
- Властивості Mxy повертають значення, які розташовуються в рядку з індексом x і в стовпці з індексом y, які змінюються від 1 до 4. Наприклад, властивість M11 повертає значення, що знаходиться на перетині першого рядка та першого стовпчика матриці, M23 - другого рядка і третього стовпця , M44 - четвертого рядка і четвертого стовпця.
- Метод CreateLookAt дозволяє створити видову матрицю (камеру).
- Метод CreateOrthographic дозволяє створити ортогональную проекційну матрицю.
- Метод CreatePerspective дозволяє створити перспективну проекційну матрицю.
- Методи CreateRotationX, CreateRotationY, CreateRotationZ дозволяють створювати матриці повороту навколо відповідної осі.
- Метод CreateScale призначений для створення матриці масштабування (зміни розмірів) об'єкта.
- Метод CreateTranslation дозволяє створити матрицю переміщення об'єкта.
- Метод CreateWorld створює світову матрицю.
Клас Vector3 використовується для зберігання координат точок в просторі, для завдання векторів і для деяких інших завдань, наприклад - для завдання параметрів матриць.
Клас BasicEffect містить безліч елементів, важливих при створенні тривимірної сцени. Саме об'єкт цього класу містить опису матриць, опису джерел світла в грі і багато інших важливих властивості і методи. За своєю внутрішньою суттю, цей клас є набором шейдеров, кожен з яких використовується в залежності від ніжеперечісленнийх властивостей:
- Властивість AmbientLightColor дозволяє встановити навколишнє освітлення розсіяним світлом
- Властивості DirectionalLight0, DirectionalLight1, DirectionalLight2 дозволяє встановити джерела спрямованого кольору
- Властивості FogColor, FogEnabled, FogEnd, FogStart дозволяють управляти ефектом туману
- Властивість LightingEnabled дозволяє вмикати освітлення
- Властивість PreferPerPixelLighting дозволяють управляти ефектом попиксельного освітлення - цей тип освітлення доступний для графічних адаптерів, що підтримують Pixel Shader Model 2.0 (Модель піксельних шейдеров 2.0.)
- Властивість Projection дозволяє управляти проекційної матрицею.
- Властивість Texture призначене для управління текстурою
- Властивість TextureEnabled дозволяє включати використання текстури
- Властивість View дозволяє управляти матрицею виду (камерою)
- Властивість World призначений для управління світовою матрицею
- Методи Begin і End дозволяють вказати початок і кінець блоку обробки ефекту.
- Метод EnableDefaultLighting дозволяє увімкнути освітлення за замовчуванням.
клас MathHelper
Містить корисні методи для проведення різних математичних операцій. Наприклад, статичний метод ToRadians позвлояет переводити значення з градусів в радіани.
При роботі з тривимірною графікою використовуються і інші об'єкти XNA, з ними ви познайомитеся в подальших роботах.