Lekce 5 - Pevné objekty

Rozšířením poslední části vytvoříme skutečné 3D objekty. Narozdíl od 2D objektů ve 3D prostoru. Změníme trojúhelník na pyramidu a čtverec na krychli. Pyramida bude vybarvena barevným přechodem a každou stěnu krychle vybarvíme jinou barvou.

int DrawGLScene(GLvoid)// Vykreslování

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Vymaže obrazovku a hloubkový buffer

glLoadIdentity();// Reset matice

glTranslatef(-1.5f,0.0f,-6.0f);// Posun doleva a do hloubky

glRotatef(rtri,0.0f,1.0f,0.0f);// Otočí pyramidu okolo osy y

Část kódu vezmeme z předchozí části a vyrobíme pomocí něj 3D objekt. Je jedna věc na kterou jsem často dotazován. Proč se objekty neotáčejí okolo své osy. Vypadá to jako by se létaly po celé obrazovce. Pokud objektu řeknete, aby se otočil okolo osy, otočí se okolo osy souřadnicového systému. Pokud chcete, aby se rotoval okolo své osy, musíte dát počátek souřadnic do jeho středu nebo aspoň tak, aby se souřadnicová osa, okolo které otáčíte, kryla s osou objektu okolo které chcete otočit.

Následující kód vytvoří pyramidu okolo centrální osy. Vrcholek pyramidy je o jednu nahoře od středu, spodek o jednu dolů. Vrchní bod je vpravo uprostřed a dolní body jsou vpravo a vlevo od středu. Všimněte si, že všechny trojúhelníky jsou kresleny ve směru proti hodinovým ručičkám. Je to důležité a bude to vysvětleno v dalších lekcích - např. lekce 11. Teď si pouze zapamatujte, že je dobré kreslit po směru nebo proti směru hodinových ručiček a pokud k tomu nemáte důvod, neměli byste dvě osy prohodit. Začneme kreslením čelní stěny. Protože všechny sdílí horní bod, uděláme jej u všech stěn červený. Barvy na spodních vrcholech se budou střídat. Čelní stěna bude mít levý bod zelený a pravý modrý. Trojúhelník na pravé straně bude mít levý bod modrý a pravý zelený. Prohozením dolních dvou barev na každé stěně uděláme společně vybarvené vrcholy na spodku každé stěny.

glBegin(GL_TRIANGLES);// Začátek kreslení pyramidy

glColor3f(1.0f,0.0f,0.0f);// Červená

glVertex3f(0.0f,1.0f,0.0f);// Horní bod (čelní stěna)

glColor3f(0.0f,1.0f,0.0f);// Zelená

glVertex3f(-1.0f,-1.0f, 1.0f);// Levý spodní bod (čelní stěna)

glColor3f(0.0f,0.0f,1.0f);// Modrá

glVertex3f( 1.0f,-1.0f, 1.0f);// Pravý spodní bod (čelní stěna)

Vykreslíme pravou stěnu. Spodní body kreslíme vpravo od středu a horní bod je kreslen o jedna na ose y od středu a pravý střed na ose x. To způsobuje, že se stěna svažuje od horního bodu doprava dolů. Levý bod je tentokrát modrý stejně jako pravý dolní bod čelní stěny, ke kterému přiléhá. Zbylé tři trojúhelníky kresleny ve stejném glBegin(GL_TRIANGLES) a glEnd() jako první trojúhelník. Protože dělám celý objekt z trojúhelníků, OpenGL ví, že každé tři body tvoří trojúhelník. Jakmile nakreslíte tři body a přidáte další body, OpenGL předpokládá, že je třeba kreslit další trojúhelník. Pokud zadáte čtyři body místo tří, OpenGL použije první tři a bude předpokládat, že čtvrtý je začátek dalšího trojúhelníku. Nevykreslí čtverec. Proto si dávejte pozor, aby jste náhodou nepřidali nějaký bod navíc.

glColor3f(1.0f,0.0f,0.0f);// Červená

glVertex3f( 0.0f, 1.0f, 0.0f);// Horní bod (pravá stěna)

glColor3f(0.0f,0.0f,1.0f);// Modrá

glVertex3f( 1.0f,-1.0f, 1.0f);// Levý bod (pravá stěna)

glColor3f(0.0f,1.0f,0.0f);// Zelená

glVertex3f( 1.0f,-1.0f, -1.0f);// Pravý bod (pravá stěna)

Teď vykreslíme zadní stěnu. Opět prohození barev. Levý bod je opět zelený, protože odpovídající pravý bod je zelený.

glColor3f(1.0f,0.0f,0.0f);// Červená

glVertex3f( 0.0f, 1.0f, 0.0f);// Horní bod (zadní stěna)

glColor3f(0.0f,1.0f,0.0f);// Zelená

glVertex3f( 1.0f,-1.0f, -1.0f);// Levý bod (zadní stěna)

glColor3f(0.0f,0.0f,1.0f);// Modrá

glVertex3f(-1.0f,-1.0f, -1.0f);// Pravý bod (zadní stěna)

Nakonec nakreslíme levou stěnu pyramidy. Protože pyramida rotuje okolo osy Y, nikdy neuvidíme podstavu. Pokud chcete experimentovat, zkuste přidat ji přidat. Potom pootočte pyramidu okolo osy x a uvidíte zda se vám to povedlo.

glColor3f(1.0f,0.0f,0.0f);// Červená

glVertex3f( 0.0f, 1.0f, 0.0f);// Horní bod (levá stěna)

glColor3f(0.0f,0.0f,1.0f);// Modrá

glVertex3f(-1.0f,-1.0f,-1.0f)// Levý bod (levá stěna)

glColor3f(0.0f,1.0f,0.0f);// Zelená

glVertex3f(-1.0f,-1.0f, 1.0f);// Pravý bod (levá stěna)

glEnd();// Konec kreslení pyramidy

Teď vykreslíme krychli. Je tvořena šesti čtverci, které jsou kresleny opět proti směru hodinových ručiček. To znamená, že první bod je pravý horní, druhý levý horní, třetí levý dolní a čtvrtý pravý dolní. Když kreslíme zadní stěnu, může to vypadat, že kreslíme ve směru hodinových ručiček, ale pamatujte, že jsme za krychlí a díváme se směrem k čelní stěně. Takže levá strana obrazovky je pravou stranou čtverce. Tentokrát posouváme krychli trochu dál. Tím velikost více odpovídá velikosti pyramidy a části mohou být oříznuty okraji obrazovky. Můžete si pohrát s nastavením počátku a uvidíte, že posunutím dále se zdá menší a naopak. Důvodem je perspektiva. Vzdálenější objekty se zdají menší.

glLoadIdentity();// Reset matice

glTranslatef(1.5f,0.0f,-7.0f);// Posun počátku vpravo a dozadu

glRotatef(rquad,1.0f,1.0f,1.0f);// Rotace okolo x, y, a z

Začneme kreslením vrcholku krychle. Všimněte si, že souřadnice y je vždy jedna. Tím kreslíme stěnu rovnoběžně s rovinou xz. Začneme pravým horním bodem. Ten je o jedna vpravo a o jedna dozadu. Další bod je o jedna vlevo a o jedna dozadu. Poté vykreslíme spodní část čtverce směrem k pozorovateli. Abychom toho dosáhli, narozdíl od posunu do obrazovky, posuneme se o jeden bod z obrazovky.

glBegin(GL_QUADS);// Začátek kreslení krychle

glColor3f(0.0f,1.0f,0.0f);// Modrá

glVertex3f( 1.0f, 1.0f,-1.0f);// Pravý horní (horní stěna)

glVertex3f(-1.0f, 1.0f,-1.0f);// Levý horní (horní stěna)

glVertex3f(-1.0f, 1.0f, 1.0f);// Levý dolní (horní stěna)

glVertex3f( 1.0f, 1.0f, 1.0f);// Pravý dolní (horní stěna)

Spodní část krychle se kreslí stejným způsobem, jen je posunuta na ose y do -1. Další změna je, že pravý horní bod je tentokrát bod bližší k vám, narozdíl od horní stěny, kde to byl bod vzdálenější. V tomto případě by se nic nestalo pokud by jste pouze zkopírovali předchozí čtyři řádky a změnili hodnotu y na -1, ale později by vám to mohlo přinést problémy například u textur.

glColor3f(1.0f,0.5f,0.0f);// Oranžová

glVertex3f( 1.0f,-1.0f, 1.0f);// Pravý horní bod (spodní stěna)

glVertex3f(-1.0f,-1.0f, 1.0f);// Levý horní (spodní stěna)

glVertex3f(-1.0f,-1.0f,-1.0f);// Levý dolní (spodní stěna)

glVertex3f( 1.0f,-1.0f,-1.0f);// Pravý dolní (spodní stěna)

Teď vykreslíme čelní stěnu.

glColor3f(1.0f,0.0f,0.0f);// Červená

glVertex3f( 1.0f, 1.0f, 1.0f);// Pravý horní (čelní stěna)

glVertex3f(-1.0f, 1.0f, 1.0f);// Levý horní (čelní stěna)

glVertex3f(-1.0f,-1.0f, 1.0f);// Levý dolní (čelní stěna)

glVertex3f( 1.0f,-1.0f, 1.0f);// Pravý dolní (čelní stěna)

Zadní stěna.

glColor3f(1.0f,1.0f,0.0f);// Žlutá

glVertex3f( 1.0f,-1.0f,-1.0f);// Pravý horní (zadní stěna)

glVertex3f(-1.0f,-1.0f,-1.0f);// Levý horní (zadní stěna)

glVertex3f(-1.0f, 1.0f,-1.0f);// Levý dolní (zadní stěna)

glVertex3f( 1.0f, 1.0f,-1.0f);// Pravý dolní (zadní stěna)

Levá stěna.

glColor3f(0.0f,0.0f,1.0f);// Modrá

glVertex3f(-1.0f, 1.0f, 1.0f);// Pravý horní (levá stěna)

glVertex3f(-1.0f, 1.0f,-1.0f);// Levý horní (levá stěna)

glVertex3f(-1.0f,-1.0f,-1.0f);// Levý dolní (levá stěna)

glVertex3f(-1.0f,-1.0f, 1.0f);// Pravý dolní (levá stěna)

Pravá stěna. Je to poslední stěna krychle. Pokud chcete tak ji vynechejte a získáte krabici. Nebo můžete zkusit nastavit pro každý roh jinou barvu a vybarvit ji barevným přechodem.

glColor3f(1.0f,0.0f,1.0f);// Fialová

glVertex3f( 1.0f, 1.0f,-1.0f);// Pravý horní (pravá stěna)

glVertex3f( 1.0f, 1.0f, 1.0f);// Levý horní (pravá stěna)

glVertex3f( 1.0f,-1.0f, 1.0f);// Levý dolní (pravá stěna)

glVertex3f( 1.0f,-1.0f,-1.0f);// Pravý dolní (pravá stěna)

glEnd();// Konec kreslení krychle

rtri+=0.2f;// Inkrementace úhlu pootočení pyramidy

rquad-=0.15f;// Inkrementace úhlu pootočení krychle

return TRUE;

}

Na konci tohoto tutoriálu byste měli lépe rozumět jak jsou vytvářeny 3D objekty. Můžete přemýšlet o OpenGL scéně jako o kusu papíru s mnoha průsvitnými vrstvami. Jako gigantická krychle tvořená body. Pokud si dokážete představit v obrazovce hloubku, neměli byste mít problém s vytvářením vlastních 3D objektů.

napsal: Jeff Molofee - NeHe <nehe (zavináč) connect.ab.ca>
přeložil: Milan Turek <nalim.kerut (zavináč) email.cz>

Zdrojové kódy

Lekce 5

<<< Lekce 4 | Lekce 6 >>>