15. rˇ´ıjna 2013, Brno ´ Pˇripravil: David Prochazka
Projekce ˇ ıtacov ˇ a´ grafika 2 Poc´
Projekce
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 2 / 38
Projekce
Strana 3 / 38
´ ı sceny ´ Zpusob ˚ vykreslovan´ 1
2
3
4
´ (nastavujeme Prohl´ızˇ en´ı – nastaven´ı kamery do sceny ˇ kter´ym se kamera bude d´ıvat“) – pohledova´ smer, ” transformace. ´ ı – vklad ´ ame ´ ´ – modelovac´ı Modelovan´ objekty do sceny transformace. ´ eru ˇ (men´ ˇ ıme nastaven´ı Projekce – nastavujeme tvar zab ´ objektivu: ohniskova´ vzdalenost, atp.) – projekˇcn´ı transformace. ˇ sen´ı/zmenˇsen´ı a namapovan´ ´ ı v´ysledneho ´ Zobrazen´ı – zvetˇ ´ ´ eˇ do poˇzadovane´ roviny – obrazku objektu˚ ve scen zobrazovac´ı transformace.
´ (Analogie s fotoaparatem)
Projekce
Princip nastaven´ı projekce
Strana 4 / 38
Projekce
Strana 5 / 38
Obecny´ princip implementace zobrazen´ı Pohledova´ a modelovac´ı matice (modelview matrix) se ˇ za behu ˇ bude dynamicky menit programu. Nastaven´ı je obvykle nutne´ vloˇzit do funkce ˇreˇs´ıc´ı ´ ı objektu. vykreslovan´ ˚ ´ – zustav Projekce – zpusob zobrazen´ı sceny a´ po celou ˚ ˚ ˇ ´ Aˇz na: dobu behu aplikace obvykle stejna. 1 2
ˇ zpusob ´ (CAD). Potˇrebujeme zmenit zobrazen´ı sceny ˚ ˇ se tvar okna, do ktereho ´ ´ ıme vykreslovan´ ´ ı. Zmenil provad´
´ nezaj´ıma, ´ podstatna´ je varianta 2. Varianta 1 nas Zavedeme novou funci void glutReshapeFunc(void (*func)(int width, int height)). ˇ velikosti okna, do ktereho ´ Tato funkce reaguje na zmenu ´ ı vykreslovan´ ´ ı. se provad´ Zaregistrovana´ funkce obdrˇz´ı v parametrech width a ´ ı velikost okna. height aktualn´
Projekce
Strana 6 / 38
Nastaven´ı projekce Abychom mohli projekci nastavit, je nutne´ aktivovat nastaven´ı projekˇcn´ı matice. ´ slouˇz´ı pˇr´ıkaz glMatrixMode K tomuto nam (GL PROJECTION). Od tohoto okamˇziku jsou vˇsechny maticove´ pˇr´ıkazy ´ na projekˇcn´ı matici. automaticky aplikovany Prvn´ı operace, kterou s projekˇcn´ı matic´ı provedeme jej´ı nastaven´ı na jednotkovou matici pomoc´ı pˇr´ıkazu glLoadIdentity(). Tento krok je doporuˇcen´y z toho duvodu, zˇ e rˇada dalˇs´ıch ˚ ´ eˇ pouˇz´ıvanou matici. operac´ı modifikuje aktualn
Ortograficka´ projekce
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 7 / 38
Ortograficka´ projekce
Strana 8 / 38
Ortograficka´ projekce Ortograficka´ projekce pˇredstavuje pravouhl´ ´ y hranol. ´ ˇ ı svoji velikost. Objekty se vzdalenost´ ı nemen´ ´ Pouˇz´ıvame v aplikac´ıch jako je CAD, kde jsou kl´ıcˇ ove´ ˇ objektu. skuteˇcne´ rozmery ˚ ´ ´ v trojrozmern ˇ em ´ Pro nastaven´ı pouˇz´ıvame pˇri praci prostoru pˇr´ıkaz void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far). ´ Parametry near/far pˇredstavuj´ı vzdalenosti k ´ ejˇ ˇ s´ı rovine, ˇ ne absolutn´ı pozice v souˇradnem ´ bliˇzsˇ ´ı/vzdalen ´ systemu!
Ortograficka´ projekce
Nastaven´ı ortograficke´ projekce
Strana 9 / 38
Ortograficka´ projekce
ˇ ı pohled Ortograficke´ projekce – bocn´
Strana 10 / 38
Ortograficka´ projekce
Strana 11 / 38
Ortograficka´ projekce – implementace ´ by se mohl nachazet ´ Cel´y kod v onResize() 1 2 3
// nastaveni oblasti pro zobrazeni glViewport (0 , 0 , 640 , 480); // nebo glViewport (0 , 0 , width , height );
4 5 6
// zaciname nastavovani projekcni matice glMatrixMode ( GL_PROJECTION );
7 8 9
// nastavime ji na jednotkovou glLoadIdentity ();
10 11 12 13
// opet je lepsi pouzit promenne reprezentujici // velikost okna glOrtho ( -5.0 ,5.0 , -5.0 ,5.0 ,0.0 ,5.0);
Ortograficka´ projekce
Strana 12 / 38
2D ortograficka´ projekce ´ ı pˇr´ıpadem je 2D ortograficka´ projekce. Specialn´ V tomto pˇr´ıpadeˇ je pouˇzit pˇr´ıkaz void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top). Parametry definuj´ı lev´y doln´ı a prav´y doln´ı roh okna. Je moˇzne´ pouˇz´ıt i pˇr´ıkaz glOrtho() s t´ım, zˇ e nastav´ıme souˇradnice pro osu z na hodnoty -1.0 a 1.0 (z u objektu˚ bude rovno 0).
Ortograficka´ projekce
Strana 13 / 38
2D orto. projekce – implementace ´ by se mohl nachazet ´ Cel´y kod v onResize() 1 2 3
// nastaveni oblasti pro zobrazeni glViewport (0 , 0 , 640 , 480); // nebo glViewport (0 , 0 , width , height );
4 5 6
// zaciname nastavovani projekcni matice glMatrixMode ( GL_PROJECTION );
7 8 9
// nastavime ji na jednotkovou glLoadIdentity ();
10 11 12 13
// opet je lepsi pouzit promenne reprezentujici // velikost okna gluOrtho2D (0 , 640 , 0 , 480);
Perspektivn´ı projekce
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 14 / 38
Perspektivn´ı projekce
Strana 15 / 38
Perspektivn´ı projekce ´ ´ Scena je definovana jako komol´y jehlan. ˇ ´ ı v bl´ızke´ Pokud je objekt o urˇcit´ych rozmerech nachaz´ ˇ zab´ıra´ vetˇ ˇ s´ı cˇ ast ´ plochy, neˇz pokud by byl oˇrezove´ rovine, ´ e. ´ ve vzdalen ˇ s´ı. Proto se bl´ızk´y objekt jev´ı vetˇ Pro nastaven´ı lze vyuˇz´ıt je void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far). B´yva´ cˇ asto nahrazen pˇr´ıkazem void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far). ´ r´ı vˇzdy pouze symetrick´y komol´y gluPerspective vytvaˇ jehlan.
Perspektivn´ı projekce
Nastaven´ı perspektivn´ı projekce
Strana 16 / 38
Perspektivn´ı projekce
ˇ ı pohled Perspektivn´ı projekce – bocn´
Strana 17 / 38
Perspektivn´ı projekce
Strana 18 / 38
Perspektivn´ı projekce – implementace ´ by se mohl nachazet ´ Cel´y kod v onResize() 1 2 3
// nastaveni oblasti pro zobrazeni glViewport (0 , 0 , 640 , 480); // nebo glViewport (0 , 0 , width , height );
4 5 6
// zaciname nastavovani projekcni matice glMatrixMode ( GL_PROJECTION );
7 8 9
// nastavime ji na jednotkovou glLoadIdentity ();
10 11 12
// nastaveni projekce glFrustum ( -1.0 , 1.0 , -1.0 , 1.0 , 1.5 , 20.0);
Nastaven´ı pohledove´ matice
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 19 / 38
Nastaven´ı pohledove´ matice
Strana 20 / 38
Nastaven´ı pohledove´ matice Je k dopozici pˇr´ıkaz gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz). ´ ˇ Jeho parametry reprezentuj´ı tˇri zakladn´ ı veci: pozici kamery – GLdouble eyex, GLdouble eyey, GLdouble eyez, ´ ˇ bod do ktereho je kamera natocena – GLdouble centerx, GLdouble centery, GLdouble, centerz, ˇ vzhuru ˇ ı kamery) – GLdouble upx, smer ˚ (tedy natocen´ GLdouble upy, GLdouble upz.
Nastaven´ı pohledove´ matice
Strana 21 / 38
Obvykle´ nastaven´ı ´ osy z ven ze sceny. ´ Vysunut´ı kamery podel ˇ vzhuru ´ osy y. Smer ˚ bude podel ˇ celou scenu). ´ (Pozoroval si pomyslneˇ couvne“, aby videl ” ´ ´ Toto nastaven´ı bude reprezentovano kodem 1 2 3 4
gluLookAt ( 0.0 , 0.0 , -5.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0)
Nastaven´ı pohledove´ matice
Pˇr´ıklady nastaven´ı pohledove´ matice
ˇ zne´ couvnut´ı“ a komplikove´ natoˇcen´ı Beˇ ”
Strana 22 / 38
Nastaven´ı pohledove´ matice
Strana 23 / 38
´ Popis nastaven´ı pˇredchoz´ıho obrazku 1
Pˇr´ıklad vlevo: ´ podel ´ osy z na pozici [0.0, Kamera je vysunuta ze sceny 0.0, -4.0], ˇ rena na stˇred sceny ´ [0.0, 0.0, 0.0], zameˇ ˇ nahoru je definovan ´ jako rovnobeˇ ˇ zn´y s osou y. smer
2
Pˇr´ıklad vpravo: Kamera leˇz´ıc´ı na souˇradnic´ıch [3.0, 0.0, -4.0], ˇ rena lehce nad stˇred sceny ´ [0.0, 2.0, 0.0], zameˇ ˇ naklonena doprava pod uhlem 45 stupnˇ u˚ [1.0, 1.0, 0.0]. ´
´ ˇ ruje Davejte pozor na orientaci os. Kladna´ poloosa osy z smeˇ dovnitˇr obrazovky“. ”
Detaily implementace
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 24 / 38
Detaily implementace
Strana 25 / 38
Pˇresne´ nastavene´ orto. projekce ˇ ´ Mejme trojuheln´ ıky s nasleduj´ ıc´ımi souˇradnicemi a barvami: ´ 1 2 3 4 5 6 7
GLint triangle [] = { 0, 5, 5, -5 , -5 , 5 , 5 , -5 , 5 , 1, 5, 2, -4 , -5 , 2 , 6 , -5 , 2};
8 9 10 11 12 13 14 15
GLfloat colors [] = { 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 1.0 , 1.0 , 0.0 , 1.0 , 1.0 , 0.0 , 1.0 , 0.0 , 1.0};
Detaily implementace
Nastaven´ı orto. projekce
Strana 26 / 38
Detaily implementace
Strana 27 / 38
Nastaven´ı orto. projekce 1
2
3
´ x a y. Osa z je Souˇradice v intervalu < 5, 5 > na osach ´ ´ zobrazovana ve vzdalenosti 0 aˇz 5 od pozorovatele. ˇ do souˇradnic [0,0,0] a otoˇcen ve Pozorovatel um´ısten ˇ kladne´ poloosy osy z. Smer ˇ vzhuru ´ ve smeru ˚ je definovan ˇ osy y. smeru glOrtho(-5.0,5.0,-5.0,5.0,0.0,5.0); gluLookAt(0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0); ˇ Zadn´ı trojuheln´ ık vypuˇsten: ´ glOrtho(-5.0,5.0,-5.0,5.0,0.0,4.0); gluLookAt(0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0); ˇ pohledu je vektor. Bod pohledu udav ´ a´ bod na linii Smer pohledu. glOrtho(-5.0,5.0,-5.0,5.0,0.0,5.0); gluLookAt(0.0,0.0,0.0,0.0,0.0,10.0,0.0,1.0,0.0);
Detaily implementace
Nastaven´ı orto. projekce 2
Strana 28 / 38
Detaily implementace
Strana 29 / 38
Nastaven´ı orto. projekce 2 1
2
3
Pozorovatel ustoupil vzad“ po ose z na pozici [0,0,-1], ” ´ v prostoru posunul a zadn´ı proto se zobrazovan´y kvadr trojuheln´ ık zmizel. ´ glOrtho(-5.0,5.0,-5.0,5.0,0.0,5.0); gluLookAt(0.0, 0.0,-1.0,0.0,0.0,10.0,0.0,1.0,0.0) ˇ sena na dvojnasobek ´ Velikost (rozsah) os x a y byla zvetˇ – ˇ s´ı okol´ı. vetˇ glOrtho(-10.0,10.0,-10.0,10.0,0.0,5.0); gluLookAt(0.0,0.0,0.0,0.0,0.0,10.0,0.0,1.0,0.0); ˇ vzhuru ´ ve smeru ˇ os x a y. Objekt je Smer ˚ byl definovan otoˇcen o 45 stupnˇ u. ˚ Objekt deformovan´y (okno ˇ e) ´ nerovnomern glOrtho(-10.0,10.0,-10.0,10.0,0.0,5.0); gluLookAt(0.0,0.0,0.0,0.0,0.0,10.0,1.0,1.0,0.0);
Detaily implementace
Strana 30 / 38
Nastaven´ı perspektivn´ı projekce 1
´ Pokud ponechame v nastaven´ı projekce stejne´ parametry. ˇ Pouze zmeˇ nme pˇr´ıkaz glOrtho() za glFrustrum(). ´ 1 nasleduj´ ´ Dostaneme zcela odliˇsn´y v´ysledek (ˇcast ıc´ıho ´ obrazku).
2
glFrustum(-5.0, 5.0, -5.0, 5.0, 1.0, 6.0); gluLookAt(0.0,0.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0); ´ e´ objekty se tedy jev´ı menˇs´ı. Bliˇzsˇ ´ı (ˇzluto-ruˇ Vzdalen ˚ zov´y) ´ ejˇ ˇ s´ı zcela zmizel. Byl pˇrekryt bliˇzsˇ ´ım se zmenˇsil, vzdalen objektem. Pozor na to, ktere´ pametry v pˇr´ıkazech znamenaj´ı pozice a ´ ktere´ vzdalenosti!
3
4
Detaily implementace
Strana 31 / 38
Vysledek ´ nastaven´ı
Vlevo: skryt´y zadn´ı trojuheln´ ık. ´ Vpravo: po posunu pozorovatele vid´ıme zadn´ı trojuheln´ ık. ´
´ ı hloubky Testovan´
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 32 / 38
´ ı hloubky Testovan´
´ ı hloubky Testovan´ ˇ Mejme trojuheln´ ıky: ´ 1 2 3 4 5 6 7
GLint triangle [] = { 1, 5, 2, -4 , -5 , 2 , 6 , -5 , 2 , 0, 5, 5, -5 , -5 , 5 , 5 , -5 , 5};
8 9 10 11 12 13 14 15
GLfloat colors [] = { 1.0 , 1.0 , 0.0 , 1.0 , 1.0 , 0.0 , 1.0 , 0.0 , 1.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0 , 0.0 , 0.0 , 0.0 , 1.0};
Strana 33 / 38
´ ı hloubky Testovan´
Strana 34 / 38
Vysledek ´
ˇ Rozhodovalo poˇrad´ı vykreslen´ı! Pro jsou opaˇcne?
´ ı hloubky Testovan´
Strana 35 / 38
´ ı hloubky Testovan´ ´ an´ ´ ı informac´ı o vzdalenosti ´ ˇ’ Pro uklad objektu˚ se pouˇz´ıva´ pamet ´ nasleduj´ ´ hloubky (Depth Buffer/Z-buffer). Je nutne´ provest ıc´ı: 1 Do bitov´ ´ ych pˇr´ıznaku˚ pˇredavan´ ych funkce ´ glutInitDisplayMode() pˇridame GLUT DEPTH. 2 Povol´ıme pouˇ ˇ hloubky pomoc´ı pˇr´ıkazu zit´ı pameti glEnable(GL DEPTH TEST). 3 glClearDepth(GLfloat depth), hodnota mazan´ ´ ı pameti ˇ hloubky mezi sn´ımky (0.0 aˇz 1.0). 4 Nastaven´ı typu testu hloubky. Obvykle se nastavuje funkce ´ ejˇ ˇ s´ı). GL LESS (bliˇzsˇ ´ı objekt pˇrekresl´ı objekt vzdalen 5 Mazan´ ´ ı pameti ˇ hloubky pˇred vykreslen´ım kaˇzdeho ´ sn´ımku. ’ ´ bud samostatneˇ zavolan´ ´ ım funkce To lze provest ´ glClear(GL DEPTH BUFFER BIT). Lze smazat zarove nˇ ´ ı bufferu˚ je rychlejˇs´ı. bufferem barev. Souˇcasne´ mazan´
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
Projekce
2
Ortograficka´ projekce
3
Perspektivn´ı projekce
4
Nastaven´ı pohledove´ matice
5
Detaily implementace
6
´ ı hloubky Testovan´
7
Shrnut´ı
Strana 36 / 38
Shrnut´ı
Shrnut´ı
´ ı hloubky! A nezapom´ınat na testovan´
Strana 37 / 38
Shrnut´ı
Strana 38 / 38
´ Kontroln´ı otazky/ ukoly ´ Vytvoˇrte aplikaci, ktera´ vykresl´ı dva trojuheln´ ıky v prostoru. ´ ´ ´ ı hloubky a Pomoc´ı klavesnice zap´ınejte a vyp´ınejte testovan´ pˇrep´ınejte projekce (a jej´ı nastaven´ı).