Posts Tagged ‘С++’
Розшифрування формату 3ds
Тобто перетворення з бінарного формату в текстовий, з виділенням основної інформації. Завантаження тривимірної моделі з текстового файлу не являє собою великої проблеми.
Файли 3ds складаються з кусків (chuncks). Кожен кусок містить іформацію про конкретний об’єкт. Кусок може мати підкуски. Всі вони містяться всередині одного головного.
Тривимірні моделі являють собою сітку трикутників (triangle mesh). Кожен трикутник – це номери трьох вершин (vertices), нумерація починається з нуля. А вершина – це три координати, і дві текстурні координати.
Мій конвертер базується на статті Damiano Vitulli. В ній ви можете прочитати про формат 3ds детальніше. Також є стаття на gamedev.ru.
Модель кубика Рубика
Моя перша нормального розміру програмка під Лінукс, написана з Code::Blocks. Тут даю кростплатформенний кусок коду. Можна записувати в файл .h і підключати в своїх проектах. На картинці – результат роботи програми під GLUT в моїй Убунті. (покращено Гаусовим розмиванням радіусу 2 пікселі, в GIMP. Просто плагін антиаліасингу лінь було шукати). З цією моделлю кубика Рубика можна робити всі законні дії (повороти) що і з нормальним пласмасовим кубиком. Не можна розбити, але суті гри це не міняє. Ще додати збереження, заплутування, і таблицю рекордів, і можна поповнювати світ Open Source новою грою
.
Все написано в доволі простому класі, який малює кубик, і виконує всі анімації. Можна додавати в будь-які тривимірні проекти з OpenGL. Функціональність стосується тільки рендерингу, і анімації. Алгоритм складання треба дописати, можливо в інших класах.
Перші кроки в DarkGDK
Створення нового проекту
Якщо встановлення пройшло успішно, вікно створення нового проекту має виглядати приблизно так:
![]() |
|
Рис. 1 Створення нового проекту гри |
Відкриття і аналіз проекту
Але ми не будемо створювати нову гру, коли вже є готова. Нову ми зможемо зробити пізніше. Зараз краще відкрити ту яка вже зроблена і працює без помилок, і почати її портити
. Для цього знаходимо папку Dark GDK. Вона в мене знаходиться тут: “C:\Program Files\The Game Creators\Dark GDK”, а ви шукайте там куди інсталювали. Далі заходимо в \Tutorials\3D Objects. Там відкриваємо файл з розширенням .sln. В Solution Exploreri знаходимо Main.cpp. Там увесь код проекту. На все про все 37 рядків. Так мало, що мені аж моторошно.
![]() |
|
Рис. 2 Дерево проектів рішення |
Перший рядок простий до геніальності:
// Завжди використовуючи DarkGDK переконайтеся що ви включили заголовочний файл.
#include "DarkGDK.h"
Далі ще крутіше:
// Точка входу в програму ця функція
void DarkGDK ( void )
Не знаю як вам, але мені подобається.
// ввімкнути синхронізацію частоти кадрів і встановити максимальну частоту кадрів 60 fps
dbSyncOn ( );
dbSyncRate ( 60 );
Перша команда еквівалентна взяттю контексту рендерингу, встановленню контексту пікселя, увімкнення подвійної буферизації, і повідомленню системі що за малювання береться наша програма, щоб система не пхалася. Десь так. Одним словом команда важлива, і відіграє роль ініціалізації. Наступна функція встановлює частоту кадрів, яка вимірюється в кадрах на секунду (fps). Може бути від 1 до 1000. Спеціальне значення нуль – встановлює частоту кадрів максимальною, на яку здатна система. Варто також зауважити, що двадцять п’ять кадрів на секунду замало, для того щоб двадцять п’ятий кадр не було видно. Я перевірив. Ніякого впливу на підсвідомість
Далі йде команда виводу тексту, яка працює аналогічно консольним командам. Тобто є невидимий курсор, і кожен раз при виводі він переміщується на наступний рядок.
dbPrint ( "Please wait loading model..." );
dbSync ( );
dbSync ( );
Дві команди dbSync ( ); виконують вивід зображення на екран. Чому їх дві, я не знаю, але з одною, текст на екрані не з’являється. Може буферизація не подвійна, а потрійна. Далі команда завантажує об’єкт (в нашому випадку текстурований анімаційний меш) з файлу .Х, і присвоює йому ідентифікатор 1.
dbLoadObject ( "Colonel-X.X", 1 );
Модель не було б видно, якби на неї не розвернули камеру. Тому додають команду
dbPositionCamera ( 0, 50, -80 );
Координати вони вгадали самі. Наступні функції працюють з анімацією:
dbLoopObject ( 1);
dbSetObjectSpeed ( 1, 40 );
Перша команда dbLoopObject ( 1); каже що об’єкт 1 буде циклічно відтвоювати всі кадри своєї анімації. Ця команда має кілька різновидів
void dbLoopObject ( int iID );
void dbLoopObject ( int iID, int iStart );
void dbLoopObject ( int iID, int iStart, int iEnd );
Перша команда відтворює всю анімацію об’єкта. Друга і третя дозволяють задати конкретний діапазон кадрів. Функція dbSetObjectSpeed ( 1, 40 ) дозволяє відкоректувати швидкість відтворення анімації об’єкта. Тепер залишилося тільки все запустити:
while ( LoopGDK ( ) )
{
dbSync ( );
}
return;
Даний цикл являє собою цикл гри. Він не закінчується поки не закінчиться гра. Команда dbSync ( ); в ньому виводить наступний кадр. А все необхідне для генерації кадру ми вже задали. В кінці за традицією return;. Ура! F5!
![]() |
|
Рис. 3 Відтворення анімації |
Редагування проекту
Перша річ, яка мені не подобається – це те, що програма працює в вікні. Це просто виправляється. Десь на початку пишемо:
dbSetWindowOff();
І вуаля – наш дядько вже танцює на весь екран. Правда роздільна здатність все одно буде малесенькою. Але ми можемо вибрати і відеорежим. Функція
dbSetDisplayMode ( 1024, 740, 32 );
Встановлює відеорежим в 1024×740 з глибиною кольору 32 біти. Якщо ви їй скажете відеорежим якого не не існує, то помилки не станеться. Функція просто вибере подібний, але доступний для відеоадаптера.






