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

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

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