Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 21
Текст из файла (страница 21)
Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèé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,ñîîòâåòñòâóþùåãî ñåðåäèíå ðåáðà. Äëÿ ýòîãîâîçüìåì ñðåäíåå àðèôìåòè÷åñêîå çíà÷åíèé ýëåìåíòîâ ìàòðèöû ââåðøèíàõ ðåáðà è ïðèáàâèì ê ïîëó÷èâøåìóñÿ çíà÷åíèþ íåêîòîðîå ïñåâäîñëó÷àéíîå ÷èñëî, ïðîïîðöèîíàëüíîå äëèíå ðåáðà. Çíà÷åíèå öåíòðàëüíîãî ýëåìåíòà ìàòðèöûâû÷èñëèì àíàëîãè÷íî,òîëüêî áóäåì áðàòü ñðåäíåå àðèôìåòè÷åñêîå ÷åòûðåõ çíà÷åíèéýëåìåíòîâ ìàòðèöû â ñåðåäèíàõ åå ðåáåð.Òåïåðü ðàçîáüåì ìàòðèöóíà ÷åòûðå êâàäðàòíûå ïîäìàòðè-öû. Çíà÷åíèÿ èõ óãëîâûõ ýëåìåíòîâ óæå îïðåäåëåíû, è ìû ìîæåì ðåêóðñèâíî ïðèìåíèòü ê ïîäìàòðèöàìîïèñàííóþ âûøåïðîöåäóðó.
Áóäåì ñïóñêàòüñÿ ðåêóðñèâíî ïî äåðåâó ïîäìàòðèöïîêà âñå ýëåìåíòûíå áóäóò îïðåäåëåíû. Ñ ïîìîùüþ ïîäáî-ðà êîýôôèöèåíòîâ ãåíåðàöèè ïñåâäîñëó÷àéíîé äîáàâêè ìîæíîðåãóëèðîâàòü ¾èçðåçàííîñòü¿ ïîâåðõíîñòè. Äëÿ ðåàëèñòè÷íîñòèïîâåðõíîñòè âàæíî ñäåëàòü âåëè÷èíó ïñåâäîñëó÷àéíîé äîáàâêèçàâèñÿùåé îò äëèíû òåêóùåãî ðåáðà ñ óìåíüøåíèåì ðàçìåðàðåáðà äîëæíî óìåíüøàòüñÿ è âîçìîæíîå îòêëîíåíèå âûñîòû åãîñåðåäèíû îò ñðåäíåãî àðèôìåòè÷åñêîãî âûñîò åãî âåðøèí.Îäèí èç äðóãèõ âàðèàíòîâ èñïîëüçîâàòü èçîáðàæåíèÿ âãðàäàöèÿõ ñåðîãî äëÿ êàðòû âûñîò. ( ýòîì ñëó÷àå ëàíäøàôòìîæíî îòòåêñòóðèðîâàòü ñ ïîìîùüþ ñîîòâåòñòâóþùåé öâåòíîéêàðòèíêè è ëèíåéíîé ãåíåðàöèè òåêñòóðíûõ êîîðäèíàò).Âíèìàíèå: èñïîëüçîâàíèå NURBS âîçìîæíî, íî íå ïðèâåòñòâóåòñÿ â ñèëó îãðàíè÷åííîñòè èñïîëüçîâàíèÿ NURBS äëÿ ðåàëüíûõ ïðèëîæåíèé.Â.3.
Èíòåðàêòèâíûé ëàíäøàôò209Ðàñêðàñêà ëàíäøàôòà×òîáû ñäåëàòü ïîëó÷èâøóþñÿ ìîäåëü íåìíîãî áîëåå íàïîìèíàþùåé ëàíäøàôò, åå ìîæíî ðàñêðàñèòü. Êàæäîé âåðøèíå ìîæíî ñîïîñòàâèòü ñâîé öâåò, çàâèñÿùèé îò âûñîòû ýòîé âåðøèíû.Íàïðèìåð, âåðøèíû âûøå îïðåäåëåííîãî óðîâíÿ ìîæíî ïîêðàñèòü â áåëûé öâåò â ïîïûòêå ñûìèòèðîâàòü øàïêè ãîð, âåðøèíûïîíèæå â êîðè÷íåâûé öâåò ñêàë, à âåðøèíû óðîâíåì åùå íèæå â çåëåíûé öâåò òðàâû. Çíà÷åíèÿ ¾óðîâíåé¿ ðàñêðàñêè ïîâåðõíîñòè ñëåäóåò ïîäîáðàòü èç ýñòåòè÷åñêèõ ñîîáðàæåíèé.Îñâåùåíèå ëàíäøàôòàÄëÿ åùå áîëüøåãî ðåàëèçìà è äëÿ ïîä÷åðêèâàíèÿ ðåëüåôàîñâåòèòü ìîäåëü ëàíäøàôòà áåñêîíå÷íî óäàëåííûì èñòî÷íèêîìñâåòà (êàê áû ñîëíöåì).Öâåò âåðøèí ìîæíî çàäàâàòü ÷åðåçglColorñîâìåñòíî ñg l C o l o r M a t e r i a l (GL_FRONT, GL_AMBIENT_AND_DIFFUSE) ;Òóìàí×òîáû óñèëèòü (èëè õîòÿ áû ñîçäàòü) èëëþçèþ áîëüøèõ ðàçìåðîâ ìîäåëè è åå ïðîòÿæåííîñòè, ìîæíî âîñïîëüçîâàòüñÿ ýôôåêòîì òóìàíà.
Òèï òóìàíà (ëèíåéíûé èëè ýêñïîíåíöèàëüíûé)ñëåäóåò âûáðàòü èç èíäèâèäóàëüíûõ ýñòåòè÷åñêèõ ïðåäïî÷òåíèé. Ñïîñîá ñîçäàíèÿ òóìàíà îïèñàí â ðàçäåëå 5.4.ÓïðàâëåíèåÝëåìåíòàðíîå óïðàâëåíèå äâèæåíèåì êàìåðû ïî êëàâèàòóðíûì ¾ñòðåëî÷êàì¿. Íàæàòèå íà ñòðåëêó ¾ââåðõ¿ ïåðåäâèæåíèå ïî íàïðàâëåíèþ âçãëÿäà âïåðåä. ¾Íàçàä¿ ïî íàïðàâëåíèþâçãëÿäà íàçàä. ¾Âëåâî¿, ¾Âïðàâî¿ ïî àíàëîãèè, ¾Page Up¿, ¾PageDown¿ ââåðõ, âíèç, ñîîòâåòñòâåííî.Ïðèëîæåíèå Â.
Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèé210ÂGLUT'åíî-öèôðîâûõïîëó÷àòüêëàâèøíàæàòèÿìîæíîíå÷åðåçàëôàâèòôóíêöèþglutSpecialFunc(void (*)(int key, int x, int y)),ãäåkey êîíñòàíòà, îáîçíà÷àþùàÿ êëàâèøó (ñì. â glut .h GLUT_KEY).Ôóíêöèÿ èñïîëüçóåòñÿ àíàëîãè÷íî glutKeyboardFunc().Äîïîëíèòåëüíàÿ ÷àñòüÓïðàâëåíèå ìûøüþÄâèæåíèå ìûøè â ãîðèçîíòàëüíîé ïëîñêîñòè (ñìåùåíèå ïîîñèX)óïðàâëÿåò óãëîì ïîâîðîòà íàïðàâëåíèÿ âçãëÿäà â ãîðè-∈ [0..2π]). Äâèæåíèå ìûøè â(ñìåùåíèå ïî îñè Y ) óïðàâëÿåò óãëîìçîíòàëüíîé ïëîñêîñòè (óãîë àëüôàâåðòèêàëüíîé ïëîñêîñòèïîâîðîòà íàïðàâëåíèÿ âçãëÿäà â âåðòèêàëüíîé ïëîñêîñòè îòíîñèòåëüíî ãîðèçîíòà (óãîë áåòà∈ [−π..π]).Çíàÿ îáà óãëà, âåêòîðíàïðàâëåíèÿ âçãëÿäà â ìèðîâûõ êîîðäèíàòàõ âû÷èñëÿåòñÿ ñëåäóþùèì îáðàçîì:d i r e c t i o n _ z = s i n ( áåòà ) ;d i r e c t i o n _ x = cos ( àëüôà ) * cos ( áåòà ) ;d i r e c t i o n _ y = s i n ( àëüôà ) * cos ( áåòà ) ;à çàòåì íîðìàëèçóåòñÿ.Âåêòîð íàïðàâëåíèÿ ¾âáîê¿ âû÷èñëÿåòñÿ êàê âåêòîðíîå ïðîèçâåäåíèå âåêòîðà íàïðàâëåíèÿ âåðòèêàëüíî ââåðõ, òî åñòü âåêòîðà(0, 0, 1)è óæå èçâåñòíîãî âåêòîðà íàïðàâëåíèÿ âçãëÿäà.Âåêòîð íàïðàâëåíèÿ ¾ââåðõ¿ âû÷èñëÿåòñÿ êàê âåêòîðíîå ïðîèçâåäåíèå âåêòîðà íàïðàâëåíèÿ âçãëÿäà è âåêòîðà íàïðàâëåíèÿ¾âáîê¿.Ïîëîæåíèå êàìåðû â OpenGL ìîæíî ïåðåäàòü c ïîìîùüþ êîìàíäûgluLookAt().
Ïîäñêàçêà:position + direction.ïàðàìåòðtargetìîæíî ïîëîæèòüðàâíûìÑìåùåíèå ïîçèöèè êàìåðû äîëæíî ïðîèñõîäèòü íå íà ôèêñèðîâàííîå ðàññòîÿíèå çà îäèí êàäð, à âû÷èñëÿòüñÿ, èñõîäÿ èçÂ.3. Èíòåðàêòèâíûé ëàíäøàôò211ñêîðîñòè ïåðåäâèæåíèÿ êàìåðû, è âðåìåíè, óøåäøåãî íà îáñ÷åòïîñëåäíåãî êàäðà. Ïåðåäâèæåíèå êàìåðû äîëæíî îñóùåñòâëÿòüñÿ â íàïðàâëåíèè âçãëÿäà. Ñêàæåì, ïî ëåâîé êíîïêå ìûøè âïåðåä, à ïî ïðàâîé íàçàä.
Äëÿ òîãî, ÷òîáû çàñå÷ü âðåìÿ,ìîæíî âîñïîëüçîâàòüñÿ ôóíêöèåétimeGetTime(),îïèñàííîé â¾mmsystem.h¿, è ðåàëèçîâàííîé â áèáëèîòåêå ¾winmm.lib¿ (òîëüêî äëÿ Windows).#include "mmsystem . h"...void Display ( ){...int system_time_before_rendering ;system_time_before_rendering = timeGetTime ( ) ;RenderFrame ( ) ;int time_spent_rendering_msec =timeGetTime ( ) − system_time_before_rendering ;...} GLUT'å äëÿ ýòîãî åñòü ñïåöèàëüíûé âûçîâ (àíàëîãè÷íîtimeGetTime()):time = glutGet (GLUT_ELAPSED_TIME) ;Âîäà, èëè íå÷òî íà íåå ïîõîæååÏðè ðàñêðàñêå ëàíäøàôòà ìîæíî äîáàâèòü åùå îäèí, ñàìûéíèæíèé ¾óðîâåíü¿ óðîâåíü âîäû.
Âåðøèíû, ðàñïîëàãàþùèåñÿíà ýòîì óðîâíå, ìîæíî ïîêðàñèòü â öâåò âîäû ïðåäïîëîæèòåëüíî, ñèíèé. Äëÿ òîãî, ÷òîáû ïîëó÷èâøèåñÿ ¾âîäîåìû¿ íå âûãëÿäåëè ïðîäîëæåíèåì ïîâåðõíîñòè ëàíäøàôòà, ïðîñòî ïîêðàøåííûì â ñèíèé öâåò, à èìåëè ïëîñêóþ ïîâåðõíîñòü, ïðè ãåíåðàöèè ïîëÿ âûñîò ìîæíî óñòàíîâèòü ïîðîã âûñîòû, íèæå êîòîðîãî¾îïóñêàòüñÿ¿ âåðøèíàì çàïðåùàåòñÿ. Åñëè äëÿ ýëåìåíòà ìàòðè-Ïðèëîæåíèå Â. Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèé212öû ãåíåðèðóåòñÿ çíà÷åíèå âûñîòû íèæå ýòîãî ïîðîãà, ýëåìåíòèíèöèàëèçèðóåòñÿ ïîðîãîâûì çíà÷åíèåì.ÎáúåêòûÏî ëàíäøàôòó ìîæíî ðàñêèäàòü â õóäîæåñòâåííîì áåñïîðÿäêå îò ïÿòèäåñÿòè îáúåêòîâ, âñòðå÷àþùèõñÿ íà ëàíäøàôòå âîáû÷íîé æèçíè, íàïðèìåð, äîìîâ èëè äåðåâüåâ.