particle[loop].zi+=particle[loop].zg;
particle[loop].life-=particle[loop].fade;// Скорочення терміну життя часток
if (particle[loop].life<0.0f)// Якщо частка перегорає
{
particle[loop].life=1.0f;// Дати нове життя
particle[loop].fade=float(rand()%100)/1000.0f+0.01f; // Випадкове значення
particle[loop].y=BOTTOM;
coin=rand();
if (coin<(RAND_MAX/8)) particle[loop].x=float(rand())/(RAND_MAX)-2.0f;
else
if (coin<(RAND_MAX/4)) particle[loop].x=float(rand())/(RAND_MAX)+1.0f;
else particle[loop].x=2*float(rand())/(RAND_MAX)-1.0f;
if (coin<(RAND_MAX/8)) particle[loop].z=float(rand())/(RAND_MAX)-2.0f;
if (coin<(RAND_MAX/4)) particle[loop].z=float(rand())/(RAND_MAX)+1.0f;
else particle[loop].z=2*float(rand())/(RAND_MAX)-1.0f;
particle[loop].xi=xspeed+float((rand()%60)-32.0f);
particle[loop].yi=yspeed+float((rand()%700)-200.0f);
particle[loop].zi=float((rand()%60)-30.0f);
col=rand()*(MAX_COLORS+1)/RAND_MAX;
if (col>3) col=0;
particle[loop].r=colors[col][0];// Вибір червоного кольору
particle[loop].g=colors[col][1];// Вибір зеленого кольору
particle[loop].b=colors[col][2];// Вибір синього кольору
}
if (keys[VK_NUMPAD8] && (particle[loop].yg<1.5f)) particle[loop].yg+=0.01f;
if (keys[VK_NUMPAD2] && (particle[loop].yg>-1.5f)) particle[loop].yg-=0.01f;
if (keys[VK_NUMPAD6] && (particle[loop].xg<1.5f)) particle[loop].xg+=0.01f;
if (keys[VK_NUMPAD4] && (particle[loop].xg>-1.5f)) particle[loop].xg-=0.01f;
return TRUE;
GLvoid KillGLWindow(GLvoid)
if (fullscreen)
ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);// Відображення курсора
if (hRC)
if (!wglMakeCurrent(NULL,NULL)) MB_ICONINFORMATION);
if (!wglDeleteContext(hRC))
MB_ICONINFORMATION);
hRC=NULL;
if (hDC && !ReleaseDC(hWnd,hDC))
if (hWnd && !DestroyWindow(hWnd))// Ми млжемо знищити вікно?
if (!UnregisterClass("OpenGL",hInstance))// Ми можемо не зареєструвати клас
hInstance=NULL;// Set hInstance To NULL
/*Наступний код створює вікно OpenGL:
*title- заголовок вікна
* width- довжина вікна
*height- висота вікна
*bits- кількість бітів для відображення кольору (8/16/24/32)
*fullscreenflag- використання повноекранного режиму*/
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
GLuintPixelFormat;// Уртимання результату після пошуку відповідності
WNDCLASSwc;// Клас структури вікна
DWORDdwExStyle;// Розширений Стиль вікна
DWORDdwStyle;// Стиль вікна
RECTWindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;
fullscreen=fullscreenflag;// Повноекранний режим
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))// Зареєструвати клас вікна
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
return FALSE;
dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);}
dwExStyle=WS_EX_APPWINDOW
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
staticPIXELFORMATDESCRIPTOR pfd=
;
if (!(hDC=GetDC(hWnd)))
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
if (!(hRC=wglCreateContext(hDC)))
MB_ICONEXCLAMATION);
if(!wglMakeCurrent(hDC,hRC))
ShowWindow(hWnd,SW_SHOW);// Показ вікна
SetForegroundWindow(hWnd);
SetFocus(hWnd);
ReSizeGLScene(width, height);
if (!InitGL())// Ініціалізація вікна
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);// Відправити повідомлення
case WM_KEYDOWN: // Чи натиснена клавіша?
keys[wParam] = TRUE;
case WM_KEYUP:// Чи клавіша відпущена?
keys[wParam] = FALSE;
case WM_SIZE:// Зміна розміра вікна OpenGL
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height
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;
TranslateMessage(&msg);// Перекласти повідомлення
DispatchMessage(&msg);// Відіслати повідомлення
else// Немає повідомлень
// Малювання сцени DrawGLScene()
if ((active && !DrawGLScene()) || keys[VK_ESCAPE]){
done=TRUE;// ESC для виходу
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 с.
Страницы: 1, 2, 3, 4, 5, 6