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
|