Використання OpenGL. Моделювання вогню

Дослідження особливостей роботи графічної бібліотеки OpenGL з метою використання її в комп'ютерному моделюванні. Розгляд синтаксису команд та програмного коду команд. Методи максимально реалістичного моделювання горіння вогню. Лістинг програми на мові С.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 22.12.2010
Размер файла 182,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

hInstance= GetModuleHandle(NULL);

wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Перемалювання вікна

wc.lpfnWndProc= (WNDPROC) WndProc;

wc.cbClsExtra= 0;// Жодних додаткових вікон

wc.cbWndExtra= 0;// Жодних додаткових вікон

wc.hInstance= hInstance;// Встановтти зразок

wc.hIcon= LoadIcon(NULL, IDI_WINLOGO); // Завантаження стандартного значка

wc.hCursor= LoadCursor(NULL, IDC_ARROW); // Завантаження координит курсора

wc.hbrBackground= NULL;wc.lpszMenuName= NULL;wc.lpszClassName= "OpenGL";// Вказання ім'я класу

if (!RegisterClass(&wc))// Зареєструвати клас вікна

{

MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;}

if (fullscreen)

{

DEVMODE dmScreenSettings;// Режим пристрою

memset(&dmScreenSettings,0,sizeof(dmScreenSettings));// Перевірка очищення пам'яті

dmScreenSettings.dmSize=sizeof(dmScreenSettings);

dmScreenSettings.dmPelsWidth= width;// Довжина вікна

dmScreenSettings.dmPelsHeight= height;// Висота вікна

dmScreenSettings.dmBitsPerPel= bits;// Кількість бітів

dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)

{

// При збої

if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

{

fullscreen=FALSE;// Присвоїти повноекранному режиму значення = FALSE

}

else

{

// Виштовхнути дані зі стека.

MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);

return FALSE;

}

}

}

if (fullscreen)

{

dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);}

else

{

dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;

dwStyle=WS_OVERLAPPEDWINDOW;

}

AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);

// Створення вікна

if (!(hWnd=CreateWindowEx(dwExStyle,"OpenGL",// Ім'я класу

title,// Заголовок вікна

dwStyle |// Певний стиль вікна

WS_CLIPSIBLINGS |// Необхідний стиль вікна

WS_CLIPCHILDREN,// Необхідний стиль вікна

0, 0,// Позиція вікна

WindowRect.right-WindowRect.left,// Розрахунок довжини

WindowRect.bottom-WindowRect.top,// Розрахунок висоти

NULL,

NULL,// Без меню

hInstance,// Зразок

NULL)))// Не передавати нічого для WM_CREATE

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

staticPIXELFORMATDESCRIPTOR pfd=

{

sizeof(PIXELFORMATDESCRIPTOR), // Розмір пікселів

1,// Номер версії

PFD_DRAW_TO_WINDOW |// Вікно повинно підтримувати формат

PFD_SUPPORT_OPENGL |// OpenGL повинен підтримувати формат

PFD_DOUBLEBUFFER,// Підтримка буферу

PFD_TYPE_RGBA,// Підтримка формату RGBA

bits,// Глибина кольору

0, 0, 0, 0, 0, 0,

0,

0,

0,

0, 0, 0, 0,

16,// 16-бітний Z-буфер

0,

0,

PFD_MAIN_PLANE,

0,

0, 0, 0// Проігнорувати маски слою

};

if (!(hDC=GetDC(hWnd)))

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

if(!SetPixelFormat(hDC,PixelFormat,&pfd))

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

if (!(hRC=wglCreateContext(hDC)))

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

if(!wglMakeCurrent(hDC,hRC))

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

ShowWindow(hWnd,SW_SHOW);// Показ вікна

SetForegroundWindow(hWnd);

SetFocus(hWnd);

ReSizeGLScene(width, height);

if (!InitGL())// Ініціалізація вікна

{

KillGLWindow();// Оновлення екрану

MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE;

}

return TRUE;

}

LRESULT CALLBACK WndProc(HWNDhWnd,// обробка вікна

UINTuMsg, // Повідлмлення вікна

WPARAMwParam,LPARAMlParam){

switch (uMsg)// Перевірка повідомлень

{

case WM_ACTIVATE:// Спостерігати за повідомленнями

{

if (!HIWORD(wParam))

{

active=TRUE;// Програма активна

}

else// Або

{

active=FALSE;// Програма більше не активна

}

return 0;// Повернення до циклу повідомлень

}

case WM_SYSCOMMAND:// Перевірка системних команд

{

switch (wParam)// Перевірка системних викликів

{

case SC_SCREENSAVE:

case SC_MONITORPOWER:

return 0;

}

break;// Вихід

}

case WM_CLOSE:// Чи отримали повідомлення?

{

PostQuitMessage(0);// Відправити повідомлення

return 0;

}

case WM_KEYDOWN: // Чи натиснена клавіша?

{

keys[wParam] = TRUE;

return 0;

}

case WM_KEYUP:// Чи клавіша відпущена?

{

keys[wParam] = FALSE;

return 0;

}

case WM_SIZE:// Зміна розміра вікна OpenGL

{

ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height

return 0;

}

}

return DefWindowProc(hWnd,uMsg,wParam,lParam);

}

int WINAPI WinMain(HINSTANCEhInstance, // Зразок

HINSTANCEhPrevInstance,// Попередній Instance

LPSTRlpCmdLine, // Командний рядок Parameters

intnCmdShow) // Вікно стану

{

MSGmsg;// Структури повідомлень вікна

BOOLdone=FALSE;// Вихід з циклу

// Створення вікна OpenGL

if (!CreateGLWindow("Fire Simulation Based On Particles",640,480,16,fullscreen))

{

return 0;// Вихід, якщо вікно не вдалося створити

}

while(!done)// Цикл працює поки=FALSE

{

if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))//

{

if (msg.message==WM_QUIT) // Чи є нові повідомлення?

{

done=TRUE;

}

else

{

TranslateMessage(&msg);// Перекласти повідомлення

DispatchMessage(&msg);// Відіслати повідомлення

}

}

else// Немає повідомлень

{

// Малювання сцени DrawGLScene()

if ((active && !DrawGLScene()) || keys[VK_ESCAPE]){

done=TRUE;// ESC для виходу

}

else

{

SwapBuffers(hDC);// Зміна буфера

if (keys[VK_ADD] && (slowdown>0.0f)) slowdown-=0.1f;// Швидкість руху часток вверх

if (keys[VK_SUBTRACT] && (slowdown<50.0f)) slowdown+=0.1f;// Швидкість руху часток вниз

if (keys[VK_PRIOR])zoom+=0.1f;// Приближення

if (keys[VK_NEXT])zoom-=0.1f;// Віддалення

if (keys[VK_UP] && (yspeed<2000)) yspeed+=1.0f;

if (keys[VK_DOWN] && (yspeed>-2000)) yspeed-=1.0f;

if (keys[VK_RIGHT] && (xspeed<2000)) xspeed+=1.0f;

if (keys[VK_LEFT] && (xspeed>-2000)) xspeed-=1.0f;

delay++; // Збільшити кольри

if (keys[VK_F1])// Якщо натиснено F1?

{

keys[VK_F1]=FALSE;

KillGLWindow();// Знащити поточне вікно

fullscreen=!fullscreen;// Відновлення вікна

if (!CreateGLWindow("Fire Simulation Based On Particles",1024,768,16,fullscreen))

{

return 0;// Quit If Window Was Not Created

}

}

}

}

}

// Вимикання

KillGLWindow();// Знищення вікна

return (msg.wParam);// Вихід з програми

}

Таким чином, ґрунтуючись на нескладній моделі поведінки вогню, мені вдалося ефективно реалізувати реалістичну імітацію оптичних процесів що виникають при горінні в повітряній атмосфері.

ВИСНОВКИ

В процесі написання курсової роботи була розглянута графічна бібліотека OpenGL з метою використання її в комп'ютерному моделюванні. Був розглянутий синтаксис команд та програмний код команд, а також бібліотеки, що відносяться до OpenGL.

Основним завданням цієї курсової роботи було максимально реалістично змоделювання горіння вогню.

Для вирішення завдання була написана програма на мові С з використанням технології OpenGL. Вона реалізує поставлене завдання на основі системи часток. Це найбільш простий і ефективний підхід, що показує непоганий результат і високу продуктивність, не накладаючи високі вимоги на відеоадаптер.

ЛІТЕРАТУРА

Эйнджел Э. Интерактивная компьютерная графика. Вводний курс на базе OpenGL / Э. Эйнджел. 2001. - 590 с.

Тихомиров Ю. Программирование трехмерной графики. Серия '' Мастер''. - СПб.: BHV-Санкт-Петербург. 2000. - 256 с.

Майер Р. В. Компьютерное моделирование физических явлений / Р. В. Майер. - Глазов: ГГПИ, 2009. - 111 с.

Мейсон Ву. OpenGL. Официальное руководство программиста / Ву Мейсон, Нейдер Д., Девис Т., Шрайнер Д. 2002. - 592 с.

Роджерс Д. Алгоритмические основы машинной графики / Д. Роджерс. М.: Мир. 1989. - 512 с.


Подобные документы

  • Программный код OpenGL. Синтаксис команд OpenGL. OpenGL как конечный автомат. Конвейер визуализации OpenGL. Библиотеки, относящиеся к OpenGL. Библиотека OpenGL. Подключаемые файлы. GLUT, инструментарий утилит библиотеки OpenGL.

    курсовая работа [304,9 K], добавлен 01.06.2004

  • Поняття та сфери використання тривимірної графіки. Описання та характеристика можливостей бібліотеки OpenGL. Загальний опис інтерфейсу мови програмування Borland C++, лістинг програми, що демонструє її можливості. Розрахунок витрат на виконання проекту.

    дипломная работа [1,6 M], добавлен 24.06.2015

  • Створення зображення (візуалізація) як завдання комп'ютерної графіки. Методи та алгоритми візуалізації. Трансформація об’єктів в бібліотеці OpengL. Побудова довільної кількості довільного розміру точок на поверхні форми засобами бібліотеки OpengL.

    контрольная работа [2,3 M], добавлен 10.09.2009

  • Характеристика основних методів сучасного викладання фізики. Моделювання як процес дослідження об’єктів пізнання за допомогою їх моделей. Розгляд особливостей використання табличного процесора EXCEL для обробки результатів лабораторних робіт з фізики.

    лабораторная работа [1,6 M], добавлен 22.12.2012

  • Розгляд принципів моделювання для дослідження роботи гідроакумулятора в системах водопостачання. Опис математичної моделі для підбору гідроакумулятора. Створення графічної моделі процесу вмикання та вимикання насосу, комп’ютерної в середовищі Delphi.

    курсовая работа [392,4 K], добавлен 08.12.2015

  • Програми, які виводять на екран характеристики комп'ютера. Розробка програми "Монітор використання ресурсів комп’ютера" на мові програмування ASM-86. Алгоритм програми та її реалізація. Системні вимоги, інструкція для користувача, лістинг програми.

    курсовая работа [22,2 K], добавлен 08.08.2009

  • Аналіз технічного забезпечення, вибір інструментального програмного забезпечення та середовища розробки програм. Створення класів для реалізації необхідних функцій для роботи програмного засобу. Розробка інтерфейсу для користувача та лістинг програми.

    курсовая работа [343,9 K], добавлен 24.08.2012

  • Проектування програми керування мікропроцесорним пристроєм світлової індикації на мові С та Assembler. Розробка алгоритму роботи програми, структурної та електричної принципових схем. Здійснення комп’ютерного моделювання для перевірки розроблених програм.

    курсовая работа [710,7 K], добавлен 04.12.2014

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

    статья [801,7 K], добавлен 18.08.2017

  • Політичне прогнозування як процес розробки науково обгрунтованого судження про ймовірносний розвиток політичних подій, шляхи і терміни його здійснення. Можливості комп'ютерного моделювання - системний підхід. Моделі та методи моделювання, їх використання.

    контрольная работа [26,0 K], добавлен 13.03.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.