Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 7
Текст из файла (страница 7)
Ìîäåëüíî-âèäîâûå ïðåîáðàçîâàíèÿ59ìåíåííûå êîîðäèíàòû ýòîé âåðøèíû: 0 xxy 0 y =M z 0 z 11ãäåM ìàòðèöà ìîäåëüíî-âèäîâîãî ïðåîáðàçîâàíèÿ. Ïåðñïåê-òèâíîå ïðåîáðàçîâàíèå è ïðîåöèðîâàíèå ïðîèçâîäèòñÿ àíàëîãè÷íî. Ñàìà ìàòðèöà ìîæåò áûòü ñîçäàíà ñ ïîìîùüþ ñëåäóþùèõêîìàíä:void g l T r a n s l a t e [ f d ] ( GLtype x , GLtype y , GLtype z )void g l R o t a t e [ f d ] ( GLtype angle ,GLtype x , GLtype y , GLtype z )void g l S c a l e [ f d ] ( GLtype x , GLtype y , GLtype z )glTranslateïðîèçâîäèò ïåðåíîñ îáúåêòà, ïðèáàâëÿÿ ê êîîðäè-íàòàì åãî âåðøèí çíà÷åíèÿ ñâîèõ ïàðàìåòðîâ.glRotate ïðîèçâîäèò ïîâîðîò îáúåêòà ïðîòèâ ÷àñîâîé ñòðåëêè(x,y,z).glScale ïðîèçâîäèò ìàñøòàáèðîâàíèå îáúåêòà (ñæàòèå èëèðàñòÿæåíèå) âäîëü âåêòîðà (x,y,z) , óìíîæàÿ ñîîòâåòñòâóþùèåíà óãîë angle (èçìåðÿåòñÿ â ãðàäóñàõ) âîêðóã âåêòîðàêîîðäèíàòû åãî âåðøèí íà çíà÷åíèÿ ñâîèõ ïàðàìåòðîâ.Âñå ýòè ïðåîáðàçîâàíèÿ èçìåíÿþò òåêóùóþ ìàòðèöó, à ïîòîìó ïðèìåíÿþòñÿ ê ïðèìèòèâàì, êîòîðûå îïðåäåëÿþòñÿ ïîçæå. ñëó÷àå, åñëè íàäî, íàïðèìåð, ïîâåðíóòü îäèí îáúåêò ñöåíû,à äðóãîé îñòàâèòü íåïîäâèæíûì, óäîáíî ñíà÷àëà ñîõðàíèòü òåêóùóþ âèäîâóþ ìàòðèöó â ñòåêå êîìàíäîéâûçâàòüglRotateglPushMatrix,çàòåìñ íóæíûìè ïàðàìåòðàìè, îïèñàòü ïðèìèòèâû,èç êîòîðûõ ñîñòîèò ýòîò îáúåêò, à çàòåì âîññòàíîâèòü òåêóùóþìàòðèöó êîìàíäîéglPopMatrix.Êðîìå èçìåíåíèÿ ïîëîæåíèÿ ñàìîãî îáúåêòà, ÷àñòî áûâàåòíåîáõîäèìî èçìåíèòü ïîëîæåíèå íàáëþäàòåëÿ, ÷òî òàêæå ïðèâîäèò ê èçìåíåíèþ ìîäåëüíî-âèäîâîé ìàòðèöû.Ýòî ìîæíî ñäåëàòü ñ ïîìîùüþ êîìàíäûÃëàâà 4.
Ïðåîáðàçîâàíèÿ îáúåêòîâ60void gluLookAt (GLdouble eyex , GLdouble eyey , GLdouble eyez ,GLdouble centx , GLdouble centy , GLdouble centz ,GLdouble upx , GLdouble upy , GLdouble upz )(eyex, eyey, eyez) îïðåäåëÿåò òî÷êó íàáëþäåíèÿ,(centx, centy, centz) çàäàåò öåíòð ñöåíû, êîòîðûé áóäåò ïðîåöèðîâàòüñÿ â öåíòð îáëàñòè âûâîäà, à âåêòîð (upx, upy, upz) çàäàåòïîëîæèòåëüíîå íàïðàâëåíèå îñè y , îïðåäåëÿÿ ïîâîðîò êàìåðû.ãäåòî÷êàÅñëè, íàïðèìåð, êàìåðó íå íàäî ïîâîðà÷èâàòü, òî çàäàåòñÿ çíà÷åíèå(0, 1, 0),à ñî çíà÷åíèåì(0, −1, 0)ñöåíà áóäåò ïåðåâåðíóòà.Ñòðîãî ãîâîðÿ, ýòà êîìàíäà ñîâåðøàåò ïåðåíîñ è ïîâîðîò îáúåêòîâ ñöåíû, íî â òàêîì âèäå çàäàâàòü ïàðàìåòðû áûâàåò óäîáíåå.
Ñëåäóåò îòìåòèòü, ÷òî âûçûâàòü êîìàíäógluLookAt()èìååòñìûñë ïåðåä îïðåäåëåíèåì ïðåîáðàçîâàíèé îáúåêòîâ, êîãäà ìîäåëüíî-âèäîâàÿ ìàòðèöà ðàâíà åäèíè÷íîé.Çàïîìíèòå: ìàòðè÷íûå ïðåîáðàçîâàíèÿ â OpenGL íóæíî çàïèñûâàòü â îáðàòíîì ïîðÿäêå. Íàïðèìåð, åñëè âû õîòèòå ñíà÷àëà ïîâåðíóòü îáúåêò, à çàòåì ïåðåäâèíóòü åãî, ñíà÷àëà âûçîâèòå êîìàíäóglTranslate() , à òîëüêî ïîòîì glRotate().
Ïîñëå ýòîãîîïðåäåëÿéòå ñàì îáúåêò.4.3. Ïðîåêöèè OpenGL ñóùåñòâóþò ñòàíäàðòíûå êîìàíäû äëÿ çàäàíèÿîðòîãðàôè÷åñêîé (ïàðàëëåëüíîé) èïåðñïåêòèâíîéïðîåêöèé.Ïåðâûé òèï ïðîåêöèè ìîæåò áûòü çàäàí êîìàíäàìèvoid glOrtho ( GLdouble l e f t , GLdouble r i g h t ,GLdouble bottom , GLdouble top ,GLdouble near , GLdouble f a r )void gluOrtho2D ( GLdouble l e f t , GLdouble r i g h t ,GLdouble bottom , GLdouble top )4.3. Ïðîåêöèè61Ïåðâàÿ êîìàíäà ñîçäàåò ìàòðèöó ïðîåêöèè â óñå÷åííûé îáúåì âèäèìîñòè (ïàðàëëåëåïèïåä âèäèìîñòè) â ëåâîñòîðîííåé ñèñòåìå êîîðäèíàò.Ïàðàìåòðû êîìàíäû çàäàþò òî÷êè(right, top, zf ar),(lef t, bottom, znear)èêîòîðûå îòâå÷àþò ëåâîìó íèæíåìó è ïðàâî-ìó âåðõíåìó óãëàì îêíà âûâîäà. Ïàðàìåòðûnearèfarçàäàþòðàññòîÿíèå äî áëèæíåé è äàëüíåé ïëîñêîñòåé îòñå÷åíèÿ ïî óäàëåíèþ îò òî÷êè(0, 0, 0)è ìîãóò áûòü îòðèöàòåëüíûìè.Ðèñ.
4.3. Îðòîãðàôè÷åñêàÿ ïðîåêöèÿÂî âòîðîé êîìàíäå, â îòëè÷èå îò ïåðâîé, çíà÷åíèÿóñòàíàâëèâàþòñÿ ðàâíûìè−1è1nearèfarñîîòâåòñòâåííî. Ýòî óäîáíî,åñëè OpenGL èñïîëüçóåòñÿ äëÿ ðèñîâàíèÿ äâóìåðíûõ îáúåêòîâ. ýòîì ñëó÷àå ïîëîæåíèå âåðøèí ìîæíî çàäàâàòü, èñïîëüçóÿêîìàíäûglVertex2.Ïåðñïåêòèâíàÿ ïðîåêöèÿ îïðåäåëÿåòñÿ êîìàíäîévoid g l u P e r s p e c t i v e ( GLdouble angley , GLdouble aspect ,GLdouble znear , GLdouble z f a r )êîòîðàÿ çàäàåò óñå÷åííûé êîíóñ âèäèìîñòè â ëåâîñòîðîííåé ñèñòåìå êîîðäèíàò.
Ïàðàìåòðangleyîïðåäåëÿåò óãîë âèäèìîñòè âãðàäóñàõ ïî îñè ó è äîëæåí íàõîäèòüñÿ â äèàïàçîíå îò 0 äî 180.Ãëàâà 4. Ïðåîáðàçîâàíèÿ îáúåêòîâ62Óãîë âèäèìîñòè âäîëü îñè x çàäàåòñÿ ïàðàìåòðîìaspect,êîòî-ðûé îáû÷íî çàäàåòñÿ êàê îòíîøåíèå ñòîðîí îáëàñòè âûâîäà (êàêïðàâèëî, ðàçìåðîâ îêíà).Ðèñ. 4.4. Ïåðñïåêòèâíàÿ ïðîåêöèÿÏàðàìåòðûzfarèznear çàäàþò ðàññòîÿíèå îò íàáëþäàòåëÿ äîïëîñêîñòåé îòñå÷åíèÿ ïî ãëóáèíå è äîëæíû áûòü ïîëîæèòåëüíûìè. ×åì áîëüøå îòíîøåíèåzf ar/znear,òåì õóæå â áóôåðå ãëó-áèíû áóäóò ðàçëè÷àòüñÿ ðàñïîëîæåííûå ðÿäîì ïîâåðõíîñòè, òàêêàê ïî óìîë÷àíèþ â íåãî áóäåò çàïèñûâàòüñÿ ¾ñæàòàÿ¿ ãëóáèíàâ äèàïàçîíå îò 0 äî 1.Ïðåæäåòå÷åìâêëþ÷èòüçàäàâàòüðåæèììàòðèöûðàáîòûñïðîåêöèé,íóæíîéíåìàòðèöåéçàáóäü-êîìàíäîéglMatrixMode(GL_PROJECTION) è ñáðîñèòü òåêóùóþ ñ ïîìîùüþâûçîâà glLoadIdentity().Ïðèìåð:/* îðòîãðàôè÷åñêàÿ ïðîåêöèÿ */glMatrixMode (GL_PROJECTION) ;glLoadIdentity ( ) ;glOrtho ( 0 , w, 0 , h , − 1.0 , 1 .
0 ) ;4.4. Îáëàñòü âûâîäà634.4. Îáëàñòü âûâîäàÏîñëå ïðèìåíåíèÿ ìàòðèöû ïðîåêöèé íà âõîä ñëåäóþùåãîïðåîáðàçîâàíèÿ ïîäàþòñÿ òàê íàçûâàåìûåóñå÷åííûå(clipped)êîîðäèíàòû. Çàòåì íàõîäÿòñÿ íîðìàëèçîâàííûå êîîðäèíàòû âåðøèí ïî ôîðìóëå: xnxc /wc yn = yc /wc znzc /wcÎáëàñòü âûâîäà ïðåäñòàâëÿåò ñîáîé ïðÿìîóãîëüíèê â îêîííîé ñèñòåìå êîîðäèíàò, ðàçìåðû êîòîðîãî çàäàþòñÿ êîìàíäîévoid glViewPort ( GLint x , GLint y ,GLint width , GLint h e i g h t )Çíà÷åíèÿ âñåõ ïàðàìåòðîâ çàäàþòñÿ â ïèêñåëàõ è îïðåäåëÿþòøèðèíó è âûñîòó îáëàñòè âûâîäà ñ êîîðäèíàòàìè ëåâîãî íèæíåãî óãëà (x,y) â îêîííîé ñèñòåìå êîîðäèíàò.
Ðàçìåðû îêîííîé ñèñòåìû êîîðäèíàò îïðåäåëÿþòñÿ òåêóùèìè ðàçìåðàìè îêíà ïðèëîæåíèÿ, òî÷êà (0,0) íàõîäèòñÿ â ëåâîì íèæíåì óãëó îêíà.Èñïîëüçóÿ ïàðàìåòðû êîìàíäûglViewPort(),OpenGL âû÷èñ-ëÿåò îêîííûå êîîðäèíàòû öåíòðà îáëàñòè âûâîäà (ox,oy) ïî ôîðìóëàì:ox = x + width/2oy = y + height/2Ïóñòüpx = width, py = height,òîãäà ìîæíî íàéòè îêîííûåêîîðäèíàòû êàæäîé âåðøèíû: xw(px /2)xn + ox yw = (py /2)yn + oyzw[(f − n)/2]zn + (n + f )/2Ïðè ýòîì öåëûå ïîëîæèòåëüíûå âåëè÷èíûnèfçàäàþò ìè-íèìàëüíóþ è ìàêñèìàëüíóþ ãëóáèíó òî÷êè â îêíå è ïî óìîë÷àíèþ ðàâíû 0 è 1 ñîîòâåòñòâåííî.
Ãëóáèíà êàæäîé òî÷êè çàïèñûâàåòñÿ â ñïåöèàëüíûé áóôåð ãëóáèíû (z-áóôåð), êîòîðûéÃëàâà 4. Ïðåîáðàçîâàíèÿ îáúåêòîâ64èñïîëüçóåòñÿ äëÿ óäàëåíèÿ íåâèäèìûõ ëèíèé è ïîâåðõíîñòåé.Óñòàíîâèòü çíà÷åíèÿnèfìîæíî âûçîâîì ôóíêöèèvoid glDepthRange ( GLclampd n , GLclampd f )ÊîìàíäàglViewPort()îáû÷íî èñïîëüçóåòñÿ â ôóíêöèè, çàðå-ãèñòðèðîâàííîé ñ ïîìîùüþ êîìàíäûglutReshapeFunc(),êîòîðàÿâûçûâàåòñÿ, åñëè ïîëüçîâàòåëü èçìåíÿåò ðàçìåðû îêíà ïðèëîæåíèÿ.4.5.
Êîíòðîëüíûå âîïðîñû1) Êàêèå ñèñòåìû êîîðäèíàò èñïîëüçóþòñÿ â OpenGL?2) Ïåðå÷èñëèòå âèäû ìàòðè÷íûõ ïðåîáðàçîâàíèé â OpenGL.Êàêèì îáðàçîì â OpenGL ïðîèñõîäÿò ïðåîáðàçîâàíèÿ îáúåêòîâ?3) ×òî òàêîå ìàòðè÷íûé ñòåê?4) Ïåðå÷èñëèòå ñïîñîáû èçìåíåíèÿ ïîëîæåíèÿ íàáëþäàòåëÿ âOpenGL.5) Êàêàÿ ïîñëåäîâàòåëüíîñòü âûçîâîâ êîìàíäglRotate() è glScale () ñîîòâåòñòâóåò êîìàíäågluLookAt(0, 0, −10, 10, 0, 0, 0, −1, 0)?glTranslate() ,6) Êàêèå ñòàíäàðòíûå êîìàíäû äëÿ çàäàíèÿ ïðîåêöèé âû çíàåòå?7) ×òî òàêîå âèäîâûå êîîðäèíàòû? Íîðìàëèçîâàííûå êîîðäèíàòû?Ãëàâà 5.Ìàòåðèàëû è îñâåùåíèåÄëÿ ñîçäàíèÿ ðåàëèñòè÷íûõ èçîáðàæåíèé íåîáõîäèìî îïðåäåëèòü êàê ñâîéñòâà ñàìîãî îáúåêòà, òàê è ñâîéñòâà ñðåäû, âêîòîðîé îí íàõîäèòñÿ.
Ïåðâàÿ ãðóïïà ñâîéñòâ âêëþ÷àåò â ñåáÿïàðàìåòðû ìàòåðèàëà, èç êîòîðîãî ñäåëàí îáúåêò, ñïîñîáû íàíåñåíèÿ òåêñòóðû íà åãî ïîâåðõíîñòü, ñòåïåíü ïðîçðà÷íîñòè îáúåêòà. Êî âòîðîé ãðóïïå ìîæíî îòíåñòè êîëè÷åñòâî è ñâîéñòâàèñòî÷íèêîâ ñâåòà, óðîâåíü ïðîçðà÷íîñòè ñðåäû, à òàêæå ìîäåëüîñâåùåíèÿ. Âñå ýòè ñâîéñòâà ìîæíî çàäàâàòü, âûçûâàÿ ñîîòâåòñòâóþùèå êîìàíäû OpenGL.5.1. Ìîäåëü îñâåùåíèÿ OpenGL èñïîëüçóåòñÿ ìîäåëü îñâåùåíèÿ, â ñîîòâåòñòâèè ñêîòîðîé öâåò òî÷êè îïðåäåëÿåòñÿ íåñêîëüêèìè ôàêòîðàìè: ñâîéñòâàìè ìàòåðèàëà è òåêñòóðû, âåëè÷èíîé íîðìàëè â ýòîé òî÷êå,à òàêæå ïîëîæåíèåì èñòî÷íèêà ñâåòà è íàáëþäàòåëÿ. Äëÿ êîððåêòíîãî ðàñ÷åòà îñâåùåííîñòè â òî÷êå íàäî èñïîëüçîâàòü åäèíè÷íûå íîðìàëè, îäíàêî êîìàíäû òèïàglScaleìîãóò èçìåíÿòüäëèíó íîðìàëåé.
×òîáû ýòî ó÷èòûâàòü, èñïîëüçóéòå óæå óïîìèíàâøèéñÿ ðåæèì íîðìàëèçàöèè âåêòîðîâ íîðìàëåé, êîòîðûé65Ãëàâà 5. Ìàòåðèàëû è îñâåùåíèå66âêëþ÷àåòñÿ âûçîâîì êîìàíäûglEnable (GL_NORMALIZE)Äëÿ çàäàíèÿ ãëîáàëüíûõ ïàðàìåòðîâ îñâåùåíèÿ èñïîëüçóþòñÿ êîìàíäûvoid glLightModel [ i f ] (GLenum pname , GLenum param )void glLightModel [ i f ] v (GLenum pname ,const GLtype * params )Àðãóìåíò pname îïðåäåëÿåò, êàêîé ïàðàìåòð ìîäåëè îñâåùåíèÿ áóäåò íàñòðàèâàòüñÿ è ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:GL_LIGHT_MODEL_LOCAL_VIEWERparam ïàðàìåòðäîëæåí áûòü áóëåâûì è çàäàåò ïîëîæåíèå íàáëþäà-òåëÿ. Åñëè îí ðàâåíGL_FALSE, òî íàïðàâëåíèå îáçîðà ñ÷è-òàåòñÿ ïàðàëëåëüíûì îñè−zâíå çàâèñèìîñòè îò ïîëîæå-íèÿ â âèäîâûx êîîðäèíàòàõ.