Блоґ одного кібера

Я не знаю куди й нащо мені бігти. Та це все таки веселіше ніж сидіти.

Posts Tagged ‘С++

Розшифрування формату 3ds

leave a comment »

Тобто перетворення з бінарного формату в текстовий, з виділенням основної інформації. Завантаження тривимірної моделі з текстового файлу не являє собою великої проблеми.

Файли 3ds складаються з кусків (chuncks). Кожен кусок містить іформацію про конкретний об’єкт. Кусок може мати підкуски. Всі вони містяться всередині одного головного.

Тривимірні моделі являють собою сітку трикутників (triangle mesh). Кожен трикутник – це номери трьох вершин (vertices), нумерація починається з нуля. А вершина – це три координати, і дві текстурні координати.

Мій конвертер базується на статті Damiano Vitulli. В ній ви можете прочитати про формат 3ds детальніше. Також є стаття на gamedev.ru.

Прочитати решту цієї замітки »

Written by bunyk

Травень 22, 2009 at 18:50

Опубліковано в Графіка, Кодерство

Tagged with ,

Модель кубика Рубика

з коментарем

Модель кубика Рубика

Модель кубика Рубика

Моя перша нормального розміру програмка під Лінукс, написана з Code::Blocks. Тут даю кростплатформенний кусок коду. Можна записувати в файл .h і підключати в своїх проектах. На картинці – результат роботи програми під GLUT в моїй Убунті. (покращено Гаусовим розмиванням радіусу 2 пікселі, в GIMP. Просто плагін антиаліасингу лінь було шукати). З цією моделлю кубика Рубика можна робити всі законні дії (повороти) що і з нормальним пласмасовим кубиком. Не можна розбити, але суті гри це не міняє. Ще додати збереження, заплутування, і таблицю рекордів, і можна поповнювати світ Open Source новою грою :) .

Все написано в доволі простому класі, який малює кубик, і виконує всі анімації. Можна додавати в будь-які тривимірні проекти з OpenGL. Функціональність стосується тільки рендерингу, і анімації. Алгоритм складання треба дописати, можливо в інших класах.

Прочитати решту цієї замітки »

Written by bunyk

Квітень 12, 2009 at 20:59

Опубліковано в Графіка, Кодерство

Tagged with ,

Перші кроки в DarkGDK

leave a comment »

Створення нового проекту

Якщо встановлення пройшло успішно, вікно створення нового проекту має виглядати приблизно так:

Рис. 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 біти. Якщо ви їй скажете відеорежим якого не не існує, то помилки не станеться. Функція просто вибере подібний, але доступний для відеоадаптера.

Written by bunyk

Лютий 6, 2009 at 13:56

Опубліковано в Графіка, Кодерство

Tagged with

Follow

Get every new post delivered to your Inbox.