Rotující jehlan

V této kapitole vytvoříme prostorový útvar, který bude rotovat okolo své svislé osy. Využijeme kód z lekce 1, kde jsme vytvořili trojúhelník. Klientská třída Lesson se nemění.

Po spuštění níže uvedeného kódu uvidíte okno, jako je na obrázku.

Rotující jehlan
Rotující jehlan

Třída Renderer

Všechny metody, kromě níže uvedených, zůstávají shodné s metodami z lekce 1. Části kódu, které se nezměnily, jsou napsány šedou barvou.

Z metody display() odstraníme část kódu, která zobrazovala trojúhelník a nahradíme ho novým kódem, který vykresluje jehlan. Navíc přidáme jednoduchou rotaci okolo osy Y.

Aby bylo možné rotovat okolo osy, přibyl jeden nový atribut třídy, který ukládá ve stupních celkový úhel, o který byl jehlan otočen.

private float rotate = 0;

Scénou otáčíme pomocí metody glRotatef(úhel, x, y, z), kde souřadnice x, y, z udávají směr osy, okolo které se otáčí. Souřadnice tří vrcholů byly nahrazeny dvanácti vrcholy jehlanu. Chceme-li každému vrcholu přiřadit jinou barvu, je nutné ji uvést. Na závěr inkrementujeme hodnotu proměnné rotate, ve které je uložen úhel, o který je jehlan otočený. Pro zjednodušení je rychlost otáčení závislá na výkonu grafické karty. Ve zdrojovém kódu v textu je uvedena pouze jedna stěna jehlanu, která je znázorněna na obrázku, zbylé tři stěny mají pouze jiné souřadnice vrcholů, viz zdrojový kód ke stažení.

public void display(GLAutoDrawable gLDrawable)

{

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

gl.glLoadIdentity();

 

gl.glTranslatef(0f, 0.0f, -2.75f);

gl.glRotatef(rotate, 0.0f, 1.0f, 0.0f);

 

gl.glBegin(GL.GL_TRIANGLES);

 

gl.glColor3f(1.0f, 0.0f, 0.0f);

gl.glVertex3f(0.0f, 1.0f, 0.0f);    //bod A

gl.glColor3f(0.0f, 1.0f, 0.0f);

gl.glVertex3f(-1.0f, -1.0f, 1.0f);  //bod B

gl.glColor3f(0.0f, 0.0f, 1.0f);

gl.glVertex3f(1.0f, -1.0f, 1.0f);   //bod C

 

.

.

.

 

gl.glEnd();

 

rotate += 0.2;

}

Body na jehlanu
Body na jehlanu

Protože vykreslujeme prostorové útvary, je potřeba zapnout testování na hloubku, aby bylo zajištěno, že bližší objekty překryjí vzdálenější. Pak se nastaví typ hloubkového vykreslování. Pro běžné vykreslování se používá GL_LESS nebo GL_LEQUAL, bližší objekty jsou překryty vzdálenějšími. Nakonec nastavíme korekci perspektivy. Při zanedbatelném snížení výkonu dosáhneme lepšího vzhledu celé scény.

public void init(GLAutoDrawable gLDrawable)

{

this.gl = gLDrawable.getGL();

 

gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

 

gl.glEnable(GL.GL_DEPTH_TEST);

gl.glDepthFunc(GL.GL_LEQUAL);

gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

 

gLDrawable.addKeyListener(this);

}