Баяковский.Начальный курс OpenGL (Раздаточные материалы), страница 7
Описание файла
Файл "Баяковский.Начальный курс OpenGL" внутри архива находится в папке "Раздаточные материалы". PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 7 страницы из PDF
Ïðåîáðàçîâàíèÿ îáúåêòîâ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 êîîðäèíàòàõ. Åñëè æå îí ðàâåíGL_TRUE,òî íàáëþäàòåëü íàõîäèòñÿ â íà÷àëå âèäîâîé ñèñòåìû êîîðäèíàò. Ýòî ìîæåò óëó÷øèòü êà÷åñòâî îñâåùåíèÿ, íî óñëîæíÿåò åãî ðàñ÷åò.Çíà÷åíèå ïî óìîë÷àíèþ:GL_FALSE.GL_LIGHT_MODEL_TWO_SIDE ïàðàìåòðparam äîë-æåí áûòü áóëåâûì è óïðàâëÿåò ðåæèìîì ðàñ÷åòà îñâåùåííîñòè êàê äëÿ ëèöåâûõ, òàê è äëÿ îáðàòíûõ ãðàíåé. Åñëè îíðàâåíGL_FALSE,òî îñâåùåííîñòü ðàññ÷èòûâàåòñÿ òîëüêîäëÿ ëèöåâûõ ãðàíåé. Åñëè æå îí ðàâåíGL_TRUE,ðàñ÷åòïðîâîäèòñÿ è äëÿ îáðàòíûõ ãðàíåé.Çíà÷åíèå ïî óìîë÷àíèþ:GL_FALSE.GL_LIGHT_MODE_AMBIENT ïàðàìåòðparamsäîë-æåí ñîäåðæàòü ÷åòûðå öåëûõ èëè âåùåñòâåííûõ ÷èñëà, êîòîðûå îïðåäåëÿþò öâåò ôîíîâîãî îñâåùåíèÿ äàæå â ñëó÷àåîòñóòñòâèÿ îïðåäåëåííûõ èñòî÷íèêîâ ñâåòà.Çíà÷åíèå ïî óìîë÷àíèþ: (0.2, 0.2, 0.2,1.0).5.2.
Ñïåöèôèêàöèÿ ìàòåðèàëîâ675.2. Ñïåöèôèêàöèÿ ìàòåðèàëîâÄëÿ çàäàíèÿ ïàðàìåòðîâ òåêóùåãî ìàòåðèàëà èñïîëüçóþòñÿêîìàíäûvoid g l M a t e r i a l [ i f ] (GLenum f a c e , GLenum pname ,GLtype param )void g l M a t e r i a l [ i f ] v (GLenum f a c e , GLenum pname ,GLtype * params )Ñ èõ ïîìîùüþ ìîæíî îïðåäåëèòü ðàññåÿííûé, äèôôóçíûéè çåðêàëüíûé öâåòà ìàòåðèàëà, à òàêæå ñòåïåíü çåðêàëüíîãî îòðàæåíèÿ è èíòåíñèâíîñòü èçëó÷åíèÿ ñâåòà, åñëè îáúåêò äîëæåíñâåòèòüñÿ. Êàêîé èìåííî ïàðàìåòð áóäåò îïðåäåëÿòüñÿ çíà÷åíèåìparam,pname:çàâèñèò îò çíà÷åíèÿ ïàðàìåòðGL_AMBIENTparams äîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò ðàññåÿííûé öâåò ìàòåðèàëà (öâåò ìàòåðèàëà âòåíè).Çíà÷åíèå ïî óìîë÷àíèþ:GL_DIFFUSE ïàðàìåòð(0.2, 0.2, 0.2, 1.0).paramsäîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò äèôôóçíûé öâåò ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:GL_SPECULAR(0.8, 0.8, 0.8, 1.0).
ïàðàìåòðparams äîëæåí ñîäåðæàòü ÷åòû-ðå öåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûå îïðåäåëÿþò çåðêàëüíûé öâåò ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:GL_SHININESS(0.0, 0.0, 0.0, 1.0). ïàðàìåòðparamsäîëæåí ñîäåðæàòü îäíîöåëîå èëè âåùåñòâåííîå çíà÷åíèå â äèàïàçîíå îò 0 äî 128,êîòîðîå îïðåäåëÿåò ñòåïåíü çåðêàëüíîãî îòðàæåíèÿ ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:0.Ãëàâà 5. Ìàòåðèàëû è îñâåùåíèå68GL_EMISSION ïàðàìåòðparams äîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò èíòåíñèâíîñòü èçëó÷àåìîãî ñâåòà ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:(0.0, 0.0, 0.0, 1.0).GL_AMBIENT_AND_DIFFUSE ýêâèâàëåíòíîglMaterial() ñî çíà÷åíèåì pnameGL_DIFFUSE è îäèíàêîâûìè çíà÷åíèÿìèäâóì âûçîâàì êîìàíäûGL_AMBIENTparams.èÈç ýòîãî ñëåäóåò, ÷òî âûçîâ êîìàíäûglMaterial[ i f ]()âîçìî-æåí òîëüêî äëÿ óñòàíîâêè ñòåïåíè çåðêàëüíîãî îòðàæåíèÿ ìàòåðèàëà (shininess). ÊîìàíäàglMaterial[ i f ]v()èñïîëüçóåòñÿ äëÿçàäàíèÿ îñòàëüíûõ ïàðàìåòðîâ.Ïàðàìåòðfaceîïðåäåëÿåò òèï ãðàíåé, äëÿ êîòîðûõ çàäà-åòñÿ ýòîò ìàòåðèàë è ìîæåò ïðèíèìàòü çíà÷åíèÿGL_BACKèëèGL_FRONT_AND_BACK.GL_FRONT,Åñëè â ñöåíå ìàòåðèàëû îáúåêòîâ ðàçëè÷àþòñÿ ëèøü îäíèìïàðàìåòðîì, ðåêîìåíäóåòñÿ ñíà÷àëà óñòàíîâèòü íóæíûé ðåæèì,âûçâàâglEnable() c ïàðàìåòðîì GL_COLOR_MATERIAL, à çàòåìèñïîëüçîâàòü êîìàíäóvoid g l C o l o r M a t e r i a l (GLenum f a c e , GLenum pname )ãäå ïàðàìåòðfaceèìååò àíàëîãè÷íûé ñìûñë, à ïàðàìåòðpnameìîæåò ïðèíèìàòü âñå ïåðå÷èñëåííûå çíà÷åíèÿ.