Matrisestakk
Børre Stenseth
Å tegne:>Planetarium

Planetarium

Hva
main
Demonstrasjon av rekursiv bruk av matrisestakken ved uttegning av en sol, med planeter og måner

I denne modulen går vi raskt gjennom bruken av matrisestakken i en scene som har en hierarkisk struktur. Det vil si at scenen består av deler med gjensidig avhengighet og at avhengigheten er slik at vi kan tegne systematisk i en hierarkisk struktur. Det eksempelet vi har valgt er et enkelt planetarium. Planetariet har en sol og to planeter med hhv. en og to måner.

Planetene roterer rundt sola og månene rundt sine respektive planeter.

Image362

Andre typiske scener med lignende struktur er roboter med kropp - overarm - underarm - hånd - fingre. Når vi tegner bruker vi modelltransformasjoner på en slik måte at vi kan tegne en forgrening og komme oss tilbake i strukturen ved hjelp av matrisestakken.

Vi ser at denne tankegangen skiller seg litt fra måten vi tenkte på når vi stablet klosser 4 klosser. Der gikk vi hele tiden tilbake til utgangspunktet når vi skulle plassere en ny kloss.

Tegnekoden

public void drawPlanets(GL gl)
 {
     GLU glu = new GLU(); // spheres
     GLUquadric glpQ=glu.gluNewQuadric();
     /** the sun in origo */
     /** Material of the sun*/
     someMaterials.SetMaterialGoldenSun(gl);
     /** radius 4 */
     glu.gluSphere(glpQ,4.0f,20,20);
     gl.glPushMatrix();
         /** a planet */
         /** This planets material */
         someMaterials.setMaterialGreenPlanet(gl);
         /** in XY-plane */
         gl.glRotatef(m_pV,1.0f,0.0f,0.0f);
         /** distance 7 */
         gl.glTranslatef(0.0f,7.0f,0.0f);
         /** radius 1 */
         glu.gluSphere(glpQ,1.0f,20,20);
         /** with its only moon */
         /** This moons material */
         someMaterials.setMaterialSilverMoon(gl);
         /** in YZ-pane (of planet) */
         gl.glRotatef(m_mV,1.0f,0.0f,0.0f);
         /** distance 1.5 */
         gl.glTranslatef(0.0f,1.5f,0.0f);
         /** radius 0.5 */
         glu.gluSphere(glpQ,0.5f,20,20);
     gl.glPopMatrix();
     gl.glPushMatrix();
         /** another planet */
         /** This planets material */
         someMaterials.setMaterialObsidianPlanet(gl);
         /** in XZ-plane */
         gl.glRotatef(m_pV2,0.0f,1.0f,0.0f);
         /** distance 10 */
         gl.glTranslatef(10.0f,0.0f,0.0f);
         /** radius 1 */
         glu.gluSphere(glpQ,1.0f,20,20);
         gl.glPushMatrix();
             /** with its first moon */
             /** These moons material */
             someMaterials.setMaterialWhiteMoon(gl);
             /** in XZ-pane (of planet) */
             gl.glRotatef(m_mV2,0.0f,1.0f,0.0f);
             /** distance 3 */
             gl.glTranslatef(3.0f,0.0f,0.0f);
             /** radius 0.5 */
             glu.gluSphere(glpQ,0.5f,20,20);
         gl.glPopMatrix();
         gl.glPushMatrix();
             /** and second moon */
             /** in XY-pane (of planet) */
             gl.glRotatef(m_mV2,0.0f,0.0f,1.0f);
             /** distance 2 */
             gl.glTranslatef(2.0f,0.0f,0.0f);
             /** radius 0.5 */
             glu.gluSphere(glpQ,0.5f,20,20);
         gl.glPopMatrix();
     gl.glPopMatrix();
     glu.gluDeleteQuadric(glpQ);
     // increment model movement
     m_Vz += 0.5f;  if (m_Vz > 360.0f) m_Vz = 0.5f;
     m_Vx += 0.1f;  if (m_Vx > 360.0f) m_Vx = 0.1f;
     m_pV += 0.1f;  if (m_pV > 360.0f) m_pV = 0.1f;
     m_mV += 0.9f;  if (m_mV > 360.0f) m_mV = 0.9f;
     m_pV2 += 0.2f; if (m_pV2 > 360.0f) m_pV2 = 0.2f;
     m_mV2 += 0.9f; if (m_mV2 > 360.0f) m_mV2 = 0.0f;
 }

Merk at du kan stoppe bevegelsen med høyre museknapp.

Referanser
  1. The OpenGL Programming Guide, 6 editionDave Schreiner, Mason Woo,Jackie Neider,Tom Davies2007Addison-Wesley Professional0321481003www.opengl.org/documentation/red_book/14-03-2010

programmet(JOGL/Netbeans): https://svn.hiof.no/svn/psource/JOGL/planets

Modulen 3D transf.

Vedlikehold
Revidert april 2010, Børre Stenseth
(Velkommen) Å tegne:>Planetarium (Rognebær)