Для того, щоб обертати об'єкти (або камеру), необхідна серйозна математична база, за допомогою якої будуть розраховуватись координати всіх об'єктів при виведенні на "плоский" екран комп'ютера. Відразу хочу сказати, що не варто лякатися, всі математичні бібліотеки вже написані за нас, ми будемо їх тільки використовувати. У будь-якому випадку, наступний текст пропускати не потрібно, незалежно від рівня знань математики.
1. Матриці, загальні поняття
Що таке матриці? Згадуємо вищу математику: матриця ¬- це набір чисел із заздалегідь відомою розмірністю рядків і стовпців.
Матриці можна складати, множити на число, множити один з одним і багато ще чого цікавого, але цей момент ми пропустимо, тому що він досить докладно викладено в будь-якому підручнику з вищої математики (підручники можна пошукати на google.com). Ми будемо користуватися матрицями як програмісти, ми їх запальними і говоримо, що з ними робити, всі розрахунки зробить математична бібліотека Direct3D, тому потрібно включити в проект заголовки модуль d3dx9.h (і бібліотеку d3dx9.lib).
Наше завдання - створити об'єкт, тобто заповнити матрицю координатами вершин об'єкта. Кожна вершина - це вектор (X, Y, Z) в тривимірному просторі. Тепер, щоб зробити якусь дію, потрібно взяти наш об'єкт (тобто матрицю) і помножити на матрицю перетворення, результат цієї операції - новий об'єкт, заданий у вигляді матриці.
У Direct3D визначені і використовуються три основні матриці: світова матриця, матриця виду і матриця проекції. Розглянемо їх докладніше.
Світова матриця (World Matrix) - дозволяє виробляти обертання, трансформацію і масштабування об'єкта, а також наділяє кожен з об'єктів своєї локальної системою координат.
Функції для роботи зі світовою матрицею:
Матриця проекції (Projection Matrix) - створює проекцію 3D сцени на екран монітора. З її допомогою об'єкт трансформується, початок координат переноситься в передню частину, а також визначається передня і задня площини відсікання.
Заповнюючи ці матриці і роблячи перетворення, ви створюєте тривимірну сцену, в якій отримуєте можливість переміщати, обертати, наближати, видаляти та виконання інших дій над об'єктами, в залежності від ваших потреб.
2. Створення об'єкта
Додаємо заголовки і бібліотеку для використання матричних функцій
Також нам знадобляться стандартні функції роботи з часом, тому підключаємо відповідний заголовки:
Змінимо формат уявлення вершин:
Будемо використовувати не перетворений тип вершин, тому що перетворення будемо робити матрицями.
Змінюємо код функції InitDirectX (). В цю функцію необхідно додати установку двох режимів відображення.
Відключаємо режим відсікання для того, щоб при обертанні можна було бачити всі сторони об'єкта:
На даний момент ми не користуємося освітленням, а зафарбовує вершини в певний колір, тому відключаємо освітлення:
Спростимо наше серце, представивши його у вигляді трьох трикутників. Будемо використовувати локальну систему координат.
3. Створення матриць перетворення
Напишемо в файлі render.h функцію SetupMatrix () в якій будуть відбуватися всі дії над матрицями.
Установка світової матриці
Для того, щоб об'єкт обертався, необхідно отримати системний час і кожне "мить" змінювати кут між локальною системою координат і світової ситемой координат. Вирощують будемо щодо осі Х, тому використовуємо функцію D3DXMatrixRotationX. Після розрахунку світової матриці необхідно застосувати її значення за допомогою функції SetTransform:
Установка матриці виду
Встановлюємо камеру в потрібному місці і направляємо її на об'єкт
Після розрахунку необхідно застосувати отримані значення:
Установка матриці проекції
D3DXMatrixPerspectiveFovLH (- функція розрахунку матриці проекції MatrixProjection, - результат прорахунку D3DX_PI / 4, - поле зору в напрямку осі У (в радіанах) 1.0f, - коефіцієнт стиснення 1.0f, - передній план відсікання сцени 100.0f); - задній план відсікання сцени
Після прорахунку необхідно застосувати отримані значення:
Розміщуємо виклик функції розрахунку матриць в функцію відтворення сцени RenderScene ().
Запускаємо на компіляцію і спостерігаємо обертання :)
Файли для завантаження