Баяковский.Начальный курс OpenGL (Раздаточные материалы), страница 20
Описание файла
Файл "Баяковский.Начальный курс OpenGL" внутри архива находится в папке "Раздаточные материалы". PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 20 страницы из PDF
Äåìîíñòðàöèîííûå ïðîãðàììû// Âûçûâàåòñÿ â êîíöå ðèñîâàíèÿ ,// ïîêàç ñ î ç ä à í í î ã î èçîáðàæåíèÿvoid SwapBuffers ( ) ;private :// ñîçäàí ëè êîíòåêñòbool m_created ;// îêíî , äëÿ êîòîðîãî êîíòåêñòHWND m_wnd;// êîíòåêñò óñòðîéñòâàHDC m_dc ;// êîíòåêñò ðèñîâàíèÿ OpenGLHGLRC m_glrc ;};#endifÏðîãðàììà Á.7. Ôàéë glrc.cpp.#include <windows . h>#include " g l r c . h"#include " a s s e r t . h"GLRC : : GLRC(HWND wnd): m_created ( f a l s e ){a s s e r t ( wnd ) ;m_wnd = wnd ;m_dc = : : GetDC( wnd ) ;a s s e r t ( m_dc ) ;}GLRC: : ~GLRC( ){i f ( m_created )Á.5.
Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32Destroy ( ) ;}void GLRC : : Destroy ( ){}wglDeleteContext ( m_glrc ) ;: : ReleaseDC (m_wnd, m_dc ) ;m_created = f a l s e ;bool GLRC : : MakeCurrent ( ){a s s e r t ( m_created ) ;i f ( IsCurrent ( ) )return true ;}BOOL r e s = wglMakeCurrent (m_dc, m_glrc ) ;return ( r e s != FALSE ) ;bool GLRC : : Create ( ){a s s e r t ( ! m_created ) ;int nPixelFormat = 0 ;DWORD f l a g s ;flags =PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER;static PIXELFORMATDESCRIPTOR pfd ={sizeof (PIXELFORMATDESCRIPTOR) ,1,197198};Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììûflags ,PFD_TYPE_RGBA,24 ,0, 0, 0, 0, 0, 0,1,0,0,0, 0, 0, 0,32 ,0,0,PFD_MAIN_PLANE,0,0, 0, 0pfd .
cAlphaBits = 8 ;nPixelFormat = ChoosePixelFormat ( m_dc, &pfd ) ;BOOL r e s =SetPixelFormat ( m_dc, nPixelFormat , &pfd ) ;i f ( r e s == FALSE)return f a l s e ;m_glrc = wglCreateContext ( m_dc ) ;m_created = true ;}return MakeCurrent ( ) ;void GLRC : : SwapBuffers ( ){a s s e r t ( m_created ) ;: : SwapBuffers (m_dc ) ;Á.5. Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32}bool GLRC : : I s C u r r e n t ( ) const{}a s s e r t ( m_created ) ;return : : wglGetCurrentContext ( ) == m_glrc ;bool GLRC : : I s C r e a t e d ( ){}return m_created ;199Ïðèëîæåíèå Â.Ïðèìåðû ïðàêòè÷åñêèõçàäàíèéÂ.1. Cornell BoxÖåëüþ çàäàíèÿ ÿâëÿåòñÿ ñîçäàíèå èçîáðàæåíèÿ çàäàííîéòðåõìåðíîé ñòàòè÷íîé ñöåíû ñðåäñòâàìè OpenGL ñ èñïîëüçîâàíèåì ñòàíäàðòíûõ ãåîìåòðè÷åñêèõ ïðèìèòèâîâ.Òðåáóåòñÿ ñîçäàòü èçîáðàæåíèå ñöåíû Cornell Box. Ýòà êëàññè÷åñêàÿ ñöåíà ïðåäñòàâëÿåò ñîáîé êîìíàòó êóáè÷åñêîãî âèäà, ñîòñóòñòâóþùåé ïåðåäíåé ñòåíêîé.
 êîìíàòå íàõîäÿòñÿ ãåîìåòðè÷åñêèå ïðåäìåòû ðàçëè÷íûõ ôîðì è ñâîéñòâ (êóáû, ïàðàëëåëåïèïåäû, øàðû), à òàêæå ïðîòÿæåííûé èñòî÷íèê ñâåòà íàïîòîëêå. Ïðèñóòñòâóåò òàêæå êàìåðà ñ çàäàííûìè ïàðàìåòðàìè(îáû÷íî îíà ðàñïîëîæåíà òàê, ÷òîáû áûëà âèäíà âñÿ êîìíàòà). îäíîé èç ëàáîðàòîðèé Êîðíåëüñêîãî óíèâåðñèòåòà òàêàÿêîìíàòà ñóùåñòâóåò â ðåàëüíîñòè, è åå ôîòîãðàôèè ñðàâíèâàþòñÿ ñ èçîáðàæåíèÿìè, ïîñòðîåííûìè ìåòîäàìè òðàññèðîâêèëó÷åé äëÿ îöåíêè òî÷íîñòè ìåòîäîâ. Íà ñòðàíèöå ëàáîðàòîðèè(http://graphics.cornell.edu) ìîæíî íàéòè îïèñàíèå ãåîìåòðèèñöåíû â òåêñòîâîì ôîðìàòå.201202Ïðèëîæåíèå Â.
Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèéÐèñ. Â.1. Ïðèìåð ñöåíû Cornell Box.Ðåàëèçàöèè ñöåíû, ïðèâåäåííîé íà ðèñóíêå Â.1, äîñòàòî÷íîäëÿ âûïîëíåíèÿ çàäàíèÿ, õîòÿ âîçìîæíî ââåäåíèå íîâûõ ïðåäìåòîâ äîïîëíèòåëüíî ê ñóùåñòâóþùèì èëè âìåñòî íèõ. Ïðèâåòñòâóåòñÿ èñïîëüçîâàíèå ïðèìèòèâîâ áèáëèîòåê GLUT è GLU.Âíèìàíèå! Ñöåíà íå äîëæíà ïðåâðàùàòüñÿ â íàáîð ðàçíîðîäíûõ ïðåäìåòîâ. Ýñòåòè÷íîñòü è îðèãèíàëüíîñòü âûïîëíåííîãîçàäàíèÿ ïðèíèìàåòñÿ âî âíèìàíèå.Ïðîòÿæåííûé èñòî÷íèê ñâåòà íà ïîòîëêå êîìíàòû ìîæíîýìóëèðîâàòü íåñêîëüêèìè òî÷å÷íûìè èñòî÷íèêàìè.Çà ïðîñòåéøóþ ðåàëèçàöèþ ñöåíû ñòàâèòñÿ 7 áàëëîâ.Ðåàëèñòè÷íîñòü ñöåíû ìîæíî çíà÷èòåëüíî ïîâûñèòü çà ñ÷åòðàçáèåíèÿ ìíîãîóãîëüíèêîâ.
Ñóòü ýòîãî â òîì, ÷òî â ìîäåëè îñâåùåíèÿ OpenGL îñâåùåííîñòü âû÷èñëÿåòñÿ â âåðøèíàõ ìíîãîóãîëüíèêà ñ ó÷åòîì íàïðàâëåíèÿ íîðìàëåé â ýòèõ âåðøèíàõ, àçàòåì ëèíåéíî èíòåðïîëèðóåòñÿ ïî âñåé ïîâåðõíîñòè. Åñëè èñïîëüçóþòñÿ îòíîñèòåëüíî áîëüøèå ìíîãîóãîëüíèêè, òî, î÷åâèäíî, íåâîçìîæíî ïîëó÷èòü äåéñòâèòåëüíî ïëàâíûå ïåðåõîäû è çà-Â.1. CORNELL BOX203òåíåíèÿ. Äëÿ ïðåîäîëåíèÿ ýòîãî íåäîñòàòêà ìîæíî ðàçáèâàòüáîëüøèå ãðàíè (ñòåíû, íàïðèìåð) íà ìíîæåñòâî ìåíüøèõ ïî ðàçìåðàì. Ñîîòâåòñòâåííî ðàçáðîñ â íàïðàâëåíèè íîðìàëåé â âåðøèíàõ îäíîãî ìíîãîóãîëüíèêà íå áóäåò ñòîëü âåëèê è çàòåíåíèåñòàíåò áîëåå ïëàâíûì (1 áàëë).Íàëîæåíèå òåêñòóð íà îáúåêòû ñöåíû ïîîùðÿåòñÿ 2-ìÿ áàëëàìè.Äîïîëíèòåëüíûìè áàëëàìè îöåíèâàåòñÿ ïðèñóòñòâèå â ñöåíåòåíåé. Îäèí èç ïðîñòåéøèõ àëãîðèòìîâ íàëîæåíèÿ òåíåé ïðèâåäåí â ðàçäåëå 8.2.
Çà åãî ðåàëèçàöèþ ìîæíî ïîëó÷èòü äî 2 áàëëîâ. Èñïîëüçîâàíèå áîëåå ïðîäâèíóòûõ àëãîðèòìîâ (íàïðèìåð,shadow volumes) áóäåò îöåíåíî äîïîëíèòåëüíûìè áàëëàìè.Ðåàëèçàöèÿ óñòðàíåíèÿ ñòóïåí÷àòîñòè (antialiasing) ìåòîäîì,ïðåäëîæåííûì â ðàçäåëå 8.1 èëè êàêèì-ëèáî äðóãèì, îöåíèâàåòñÿ â 2 áàëëà.Çà ââåäåíèå â ñöåíó ïðîçðà÷íûõ îáúåêòîâ è êîððåêòíûé èõâûâîä äàåòñÿ 1 áàëë. Ìåõàíèçì ðàáîòû ñ ïðîçðà÷íûìè îáúåêòàìè îïèñàí â ðàçäåëå 7.1.Çàäàíèå îöåíèâàåòñÿ, èñõîäÿ èç 15 áàëëîâ. ïðèâåäåííîé íèæå òàáëèöå óêàçàíî ðàñïðåäåëåíèå áàëëîââ çàâèñèìîñòè îò ðåàëèçîâàííûõ òðåáîâàíèé:Ïðîñòåéøèé âàðèàíò ñöåíû (òîëüêî îñâåùåíèå)7 áàëëîâÐàçáèåíèå ïîëèãîíîâ+1 áàëëÈñïîëüçîâàíèå òåêñòóð+2 áàëëàÍàëîæåíèå òåíåé+2 áàëëàÓñòðàíåíèå ñòóïåí÷àòîñòè+2 áàëëàÈñïîëüçîâàíèå ïðîçðà÷íûõ îáúåêòîâ+1 áàëëÄîïîëíèòåëüíûå áàëëû ìîæíî ïîëó÷èòü çà õîðîøóþ îïòèìèçàöèþ ïðîãðàììû, íåîáû÷íûå ðåøåíèÿ, ýñòåòè÷íîñòü è ò.ä.Ïðèëîæåíèå Â.
Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèé204Â.2. Âèðòóàëüíûå ÷àñûÖåëüþ çàäàíèÿ ÿâëÿåòñÿ ñîçäàíèå òðåõìåðíîé èíòåðàêòèâíîé ìîäåëè àíàëîãîâûõ ÷àñîâ.Ðèñ. Â.2. Ïðèìåð òðåõìåðíûõ âèðòóàëüíûõ ÷àñîâ.Îáÿçàòåëüíûå òðåáîâàíèÿ ê ïðîãðàììå:Ïðîãðàììà äîëæíà äåìîíñòðèðîâàòü íà ýêðàíå òðåõìåðíóþ ìîäåëü ÷àñîâ. ×àñû ìîãóò áûòü ëþáûå, îò íàðó÷íûõäî êðåìëåâñêèõ. Ïðîÿâèòå â ïîëíîé ìåðå Âàøó ôàíòàçèþ è÷óâñòâî ìåðû! Ïîñòàðàéòåñü ñäåëàòü êàê ìîæíî áîëåå ðåàëèñòè÷íóþ ñöåíó. Ïîîùðÿåòñÿ ïîäðîáíàÿ äåòàëèçàöèÿ ýëåìåíòîâ ÷àñîâ.×àñû íà ýêðàíå îáÿçàòåëüíî äîëæíû èìåòü ìèíóòíóþ è÷àñîâóþ ñòðåëêè. Ñåêóíäíàÿ ïî æåëàíèþ, íî î÷åíü ïðèâåòñòâóåòñÿ (èíà÷å òðóäíî áóäåò îïðåäåëèòü, õîäÿò ÷àñûèëè íåò).Â.2. Âèðòóàëüíûå ÷àñû205Âðåìÿ íà ÷àñàõ äîëæíî ñîâïàäàòü ñ ñèñòåìíûì âðåìåíåìêîìïüþòåðà.
×àñû îáÿçàòåëüíî äîëæíû õîäèòü, ò.å. ñòðåëêè äîëæíû äâèãàòüñÿ, è ñêîðîñòü èõ äâèæåíèÿ íå äîëæíàçàâèñåòü îò ïðîèçâîäèòåëüíîñòè êîìïüþòåðà, à îïðåäåëÿòüñÿ òîëüêî òåêóùèì âðåìåíåì.Ñöåíà äîëæíà áûòü èíòåðàêòèâíîé, ò.å. äàâàòü ïðèåìëåìóþ ÷àñòîòó êàäðîâ â ñåêóíäó (>10) ïðè âèçóàëèçàöèè íàìàøèíå ñ àïïàðàòíûì óñêîðèòåëåì òðåõìåðíîé ãðàôèêè.Åñëè ïðîãðàììà áóäåò ðàáîòàòü ìåäëåííî, áàëëû ìîãóòáûòü ñíèæåíû.Íåîáõîäèìî ðåàëèçîâàòü âðàùåíèÿ ÷àñîâ (èëè, âîçìîæíî,êàìåðû) ñ ïîìîùüþ ìûøè (ïðåäïî÷òèòåëüíî) èëè êëàâèàòóðû. Ìîæíî òàêæå ïðåäóñìîòðåòü ðåæèìû ñ àâòîìàòè÷åñêèì âðàùåíèåì.Ïîæåëàíèÿ ê ïðîãðàììå:Ïîîùðÿåòñÿ ââåäåíèå äîïîëíèòåëüíîé ãåîìåòðèè. Íàïðèìåð, ðåìåøêîâ, ìàÿòíèêîâ è ò.ä.
Ìîæíî ñäåëàòü ÷àñû ñ êóêóøêîé, áóäèëüíèê è ò.ï.Æåëàòåëüíî íàëè÷èå âîçìîæíîñòåé äëÿ óïðàâëåíèÿ ïðîöåññîì âèçóàëèçàöèè. Íàïðèìåð, íàëè÷èå/îòñóòñòâèå òåêñòóð, ðåæèìû çàëèâêè, äåòàëèçàöèè è ò.ä.Ïðèâåòñòâóåòñÿ âûïîëíåíèå çàäàíèÿ â âèäå äåìîíñòðàöèè,ò.å. c âîçìîæíîñòüþ ðàáîòû â ïîëíîýêðàííîì ðåæèìå èíåìåäëåííûì âûõîäîì ïî êëàâèøå Escape. Ìîæíî íàïèñàòü ïðîãðàììó êàê Screen Saver.Ïîñòàðàéòåñü èñïîëüçîâàòü ìàêñèìóì âîçìîæíîñòåé áèáëèîòåêè OpenGL. Áëèêè, îòðàæåíèÿ, ñïåöýôôåêòû çàâñå ýòî îáÿçàòåëüíî äàþòñÿ äîïîëíèòåëüíûå áàëëû.Ïðèëîæåíèå Â.
Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèé206Ïðîÿâèòå âêóñ ñäåëàéòå òàê, ÷òîáû íðàâèëîñü ïðåæäåâñåãî Âàì. Íî íå óâëåêàéòåñü îñòàâàéòåñü ðåàëèñòàìè.Ìàêñèìàëüíàÿ îöåíêà 20 áàëëîâ. Çà ìèíèìàëüíóþ ðåàëèçàöèþ òðåáîâàíèé ñòàâèòüñÿ 10 áàëëîâ. Åùå äî 10 áàëëîâ ìîæíî ïîëó÷èòü çà èñïîëüçîâàíèå â ðàáîòå âîçìîæíîñòåé OpenGL(òåêñòóð, ïðîçðà÷íîñòè, ñôåðè÷åñêîãî òåêñòóðèðîâàíÿè è ïð.),îðèãèíàëüíûõ è ïðîäâèíóòûõ àëãîðèòìîâ, êîëè÷åñòâî íàñòðîåê,à òàêæå çà ýñòåòè÷íîñòü è êðàñîòó ñöåíû.Â.3. Èíòåðàêòèâíûé ëàíäøàôòÖåëüþ äàííîãî çàäàíèÿ ÿâëÿåòñÿ ãåíåðàöèÿ è âûâîä ñ ïîìîùüþ OpenGL ïîâåðõíîñòè ëàíäøàôòà, à òàêæå îáåñïå÷åíèåèíòåðàêòèâíîãî ïåðåäâèæåíèÿ íàä íåé.Ðèñ.
Â.3. Ïðèìåð òðåõìåðíîãî ëàíäøàôòà.Â.3. Èíòåðàêòèâíûé ëàíäøàôò207Îáÿçàòåëüíàÿ ÷àñòü çàäàíèÿÄëÿ âûïîëíåíèÿ îáÿçàòåëüíîé ÷àñòè çàäàíèÿ íåîáõîäèìû:ãåíåðàöèÿ òðåõìåðíîãî ëàíäøàôòàðàñêðàñêà äëÿ ïðèäàíèÿ ðåàëèñòè÷íîñòèýôôåêò òóìàíàâîçìîæíîñòü ¾ïîëåòà¿ íàä ëàíäøàôòîì (óïðàâëåíèå)Áîëåå ïîäðîáíîå îïèñàíèå:Ãåíåðàöèÿ ëàíäøàôòàÎäèí èç âàðèàíòîâ çàäàíèÿ ïîâåðõíîñòè ëàíäøàôòà çàäà-z = f (x, y),êîòîðàÿ ñîïîñòàâëÿåò êàæäîé òî÷êå (x, y) ïëîñêîñòè OXY ÷èñëîz âûñîòó ïîâåðõíîñòè ëàíäøàôòà â ýòîé òî÷êå.
Îäèí èç ñïîñîáîâ çàäàíèÿ ôóíêöèè f òàáëè÷íûé, êîãäà ôóíêöèÿ f ïðåäñòàâëÿåòñÿ ìàòðèöåé T ðàçìåðà M ×N , è äëÿ öåëûõ x è y f = T [x, y],à äëÿ äðîáíûõ x è y èç äèàïàçîíîâ [0..M − 1] è [0..N − 1] ñîîòâåòñòâåííî, f âû÷èñëÿåòñÿ èíòåðïîëÿöèåé çíà÷åíèé f â áëèæàéøèõòî÷êàõ ïëîñêîñòè OXY ñ öåëûìè x è y , à âíå óêàçàííûõ äèàïàçîíîâ x è y çíà÷åíèå ôóíêöèè ñ÷èòàåòñÿ íåîïðåäåëåííûì.íèå òàê íàçûâàåìîãî ¾ïîëÿ âûñîò¿ ôóíêöèè âèäàÄîïóñòèì, â ïàìÿòè ëåæèò äâóõìåðíûé ìàññèâ ñî çíà÷åíèÿ-T . Ïóñòü N = M . Åñëè òåïåðü äëÿ êàæäîãî êâàäðàòà[x, x + 1] × [y, y + 1], ãäå x è y ïðèíàäëåæàò äèàïàçîíó [0..N − 2]ïîñòðîèòü äâå ãðàíè: ((x, y, T [x, y]), (x+1, y, T [x+1, y]), (x+1, y +1, T [x+1, y +1])) è ((x, y, T [x, y]), (x+1, y +1, T [x+1, y +1]), (x, y +1, T [x, y + 1])), òî ìû ïîëó÷èì òðåõìåðíóþ ìîäåëü ïîâåðõíîñòè,ìè ìàòðèöûîïèñûâàåìîé ìàòðèöåé Ò.Íî êàêèì îáðàçîì çàäàòü ìàññèâ çíà÷åíèé ìàòðèöûT ? Îäèíèç ñïîñîáîâ ñãåíåðèðîâàòü ïñåâäîñëó÷àéíóþ ïîâåðõíîñòü ñ ïî-208Ïðèëîæåíèå Â.
Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèéìîùüþ ôðàêòàëüíîãî ðàçáèåíèÿ. Äëÿ ýòîãî ïîëîæèì ðàçìåðíîñòü ìàòðèöûTðàâíîé2N + 1 ,ãäåN íàòóðàëüíîå ÷èñëî.Çàäàäèì íåêîòîðûå ïðîèçâîëüíûå (ïñåâäîñëó÷àéíûå) çíà÷åíèÿäëÿ ÷åòûðåõ óãëîâûõ ýëåìåíòîâ ìàòðèöû . Òåïåðü äëÿ êàæäîãîèç ÷åòûðåõ ðåáåð ìàòðèöû(ýòî ñòîëáöû èëè ñòðîêè ýëåìåí-òîâ, ñîåäèíÿþùèå óãëîâûå ýëåìåíòû) âû÷èñëèì çíà÷åíèå ýëåìåíòà ìàòðèöûT,ñîîòâåòñòâóþùåãî ñåðåäèíå ðåáðà. Äëÿ ýòîãîâîçüìåì ñðåäíåå àðèôìåòè÷åñêîå çíà÷åíèé ýëåìåíòîâ ìàòðèöû ââåðøèíàõ ðåáðà è ïðèáàâèì ê ïîëó÷èâøåìóñÿ çíà÷åíèþ íåêîòîðîå ïñåâäîñëó÷àéíîå ÷èñëî, ïðîïîðöèîíàëüíîå äëèíå ðåáðà. Çíà÷åíèå öåíòðàëüíîãî ýëåìåíòà ìàòðèöûâû÷èñëèì àíàëîãè÷íî,òîëüêî áóäåì áðàòü ñðåäíåå àðèôìåòè÷åñêîå ÷åòûðåõ çíà÷åíèéýëåìåíòîâ ìàòðèöû â ñåðåäèíàõ åå ðåáåð.Òåïåðü ðàçîáüåì ìàòðèöóíà ÷åòûðå êâàäðàòíûå ïîäìàòðè-öû.
Çíà÷åíèÿ èõ óãëîâûõ ýëåìåíòîâ óæå îïðåäåëåíû, è ìû ìîæåì ðåêóðñèâíî ïðèìåíèòü ê ïîäìàòðèöàìîïèñàííóþ âûøåïðîöåäóðó. Áóäåì ñïóñêàòüñÿ ðåêóðñèâíî ïî äåðåâó ïîäìàòðèöïîêà âñå ýëåìåíòûíå áóäóò îïðåäåëåíû. Ñ ïîìîùüþ ïîäáî-ðà êîýôôèöèåíòîâ ãåíåðàöèè ïñåâäîñëó÷àéíîé äîáàâêè ìîæíîðåãóëèðîâàòü ¾èçðåçàííîñòü¿ ïîâåðõíîñòè. Äëÿ ðåàëèñòè÷íîñòèïîâåðõíîñòè âàæíî ñäåëàòü âåëè÷èíó ïñåâäîñëó÷àéíîé äîáàâêèçàâèñÿùåé îò äëèíû òåêóùåãî ðåáðà ñ óìåíüøåíèåì ðàçìåðàðåáðà äîëæíî óìåíüøàòüñÿ è âîçìîæíîå îòêëîíåíèå âûñîòû åãîñåðåäèíû îò ñðåäíåãî àðèôìåòè÷åñêîãî âûñîò åãî âåðøèí.Îäèí èç äðóãèõ âàðèàíòîâ èñïîëüçîâàòü èçîáðàæåíèÿ âãðàäàöèÿõ ñåðîãî äëÿ êàðòû âûñîò.