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

Історія хвороби контуженого інформаційним вибухом

Posts Tagged ‘С++

Моє XVideo позеленіло :(

leave a comment »

Вчора не міг заснути. Мучило невирішене питання. Яким чином mplayer може рендерити купу fps в повноекранному режимі, встигаючи при цьому читати з диска і робити декодинг. В такому разі я повинен могти отримати ще більше fps при рендерингу якоїсь функції виду

RGB video(int x, int y, int frame);

Зранку встав і почитав про mplayer -vo help. Помилувався драйвером matrixview.

Почитав про X Video, там знайшов посилання на демо-код, і вирішив спробувати скомпілювати: “gcc -o testxv testxv.c -L/usr/X11R6/lib -lX11 -lXext -lXv“. Вийшло не зразу. Після встановлення пакетів libx11-dev, x11proto-video-dev, libxcb-xv0-dev, libxv-dev.

Скомпілювалось, і почав гратись. Чомусь ніяк не міг отримати ніякого кольору крім зеленого і чорного. Навіть написав функцію перетворення кольорової моделі з моєї улюбленої RGB в якусь незрозумілу YUV.

Може неправильно?

Нічого. А ще гірше, що коли змінив роздільну здатність, то fps впали до 10-15.

Отака пічалька. 😦

Може використати SDL? Напевне я спробую SDL. Там hello world точно коротший.

P.S. Поки навіть не знаю що я хочу намалювати. Може потенціал електричного поля в системі з кількома рухомими зарядами, або анімацію якогось фрактальчика, але руки сверблять просто зробити і знати що я це можу.

Written by bunyk

29 Вересня, 2012 at 08:52

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

Tagged with ,

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

with one comment

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

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

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

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

Прочитати решту цього запису »

Written by bunyk

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

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

Tagged with ,

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

with one comment

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

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

Моя перша нормального розміру програмка під Лінукс, написана з 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