на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Використання OpenGL. Моделювання вогню
p align="left">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))

MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK

if (hWnd && !DestroyWindow(hWnd))// Ми млжемо знищити вікно?

MB_ICONINFORMATION);

hWnd=NULL;// Set hWnd To NULL

if (!UnregisterClass("OpenGL",hInstance))// Ми можемо не зареєструвати клас

MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK

}

/*Наступний код створює вікно 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))// Зареєструвати клас вікна

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

}

}

if (fullscreen)

{

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

else

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

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

MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK

staticPIXELFORMATDESCRIPTOR pfd=

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

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

PFD_DRAW_TO_WINDOW ;

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

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

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

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

MB_ICONEXCLAMATION);

return FALSE;

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

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

MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK

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

MB_ICONEXCLAMATION);

return FALSE;

if(!wglMakeCurrent(hDC,hRC))

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

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 с.

Страницы: 1, 2, 3, 4, 5



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.