Dialogboks
Grafikk
Børre Stenseth
Å tegne:>Kloss

Å tegne en kloss med JOGL

Hva

Vi skal tegne ut en kloss med og uten interaksjon.

OpenGL har i prinsipp ikke noe apparat for å handtere geometriske figurer. Noen slike finnes i glu-biblioteket (quadricene), men vi må være forberedte på selv å lage funksjoner som tegner ut ulike romfigurer. En kloss er nyttig å ha, så vi lager en klossfunksjon. Du kan betrakte dette som en nyttig øvelse i å konstruere uttegningsrutiner. Utgangspunktet er følgende figur som viser en kloss i utbrettet tilstand

kloss

Vi må tegne ut de 6 flatene F1..F6. Vi må passe på at vi holder styr på hva som er forsiden ( front ) og hva som er baksiden (back) på flatene. OpenGL skiller mellom dette og vi kan blant annet tildele ulike materialegenskaper til forsiden og baksiden. I dette tilfellet skal vi tegne en lukket boks, og konsentrerer oss om utsiden. Vi må være systematiske under uttegningen og vi bestemmer oss for at vi vil tegne hver flate slik at vi angir punktene med klokka, når vi betrakter flaten utenfra.

Da er flatene beskrevet slik:

F1: adcb F4: fcde
F2. abgh F5: ahed
F3: gfeh F6: bcfg

Vi må bestemme oss for hvordan vi skal forholde oss til klossens størrelse.

Vi kan enten la klossens dimensjoner og plassering inngå som parametrre til en kloss-funksjon. I så fall vil det kanskje være naturlig å velge et punkt, og utstrekningen i x-, y- og z-retningen som parametre. Dette vil gjøre rotasjon vanskelig.

Vi velger den siste strategien og bestemmer oss for å legge origo i a, x-aksen langs ab, y-aksen langs ah og z-aksen langs ad. Punktkoordinatene blir:

a: 0,0,0 e: 1,0,1
b: 0,1,0 f: 1,1,1
c: 0,1,1 g: 1,1,0
d: 0,0,1 h: 1,0,0

Vi pakker uttegningen inn i enklasse så vi kan gjenbruke den enkelt:

public class oneBox
{
    static void drawMe(GL gl)
    {
      /* draws the sides of a unit cube (0,0,0)-(1,1,1) */
      gl.glBegin(GL.GL_POLYGON);/* f1: front */
        gl.glNormal3f(-1.0f,0.0f,0.0f);
        gl.glVertex3f(0.0f,0.0f,0.0f);
        gl.glVertex3f(0.0f,0.0f,1.0f);
        gl.glVertex3f(1.0f,0.0f,1.0f);
        gl.glVertex3f(1.0f,0.0f,0.0f);
      gl.glEnd();
      gl.glBegin(GL.GL_POLYGON);/* f2: bottom */
        gl.glNormal3f(0.0f,0.0f,-1.0f);
        gl.glVertex3f(0.0f,0.0f,0.0f);
        gl.glVertex3f(1.0f,0.0f,0.0f);
        gl.glVertex3f(1.0f,1.0f,0.0f);
        gl.glVertex3f(0.0f,1.0f,0.0f);
      gl.glEnd();
      gl.glBegin(GL.GL_POLYGON);/* f3:back */
        gl.glNormal3f(1.0f,0.0f,0.0f);
        gl.glVertex3f(1.0f,1.0f,0.0f);
        gl.glVertex3f(1.0f,1.0f,1.0f);
        gl.glVertex3f(0.0f,1.0f,1.0f);
        gl.glVertex3f(0.0f,1.0f,0.0f);
      gl.glEnd();
      gl.glBegin(GL.GL_POLYGON);/* f4: top */
        gl.glNormal3f(0.0f,0.0f,1.0f);
        gl.glVertex3f(1.0f,1.0f,1.0f);
        gl.glVertex3f(1.0f,0.0f,1.0f);
        gl.glVertex3f(0.0f,0.0f,1.0f);
        gl.glVertex3f(0.0f,1.0f,1.0f);
      gl.glEnd();
      gl.glBegin(GL.GL_POLYGON);/* f5: left */
        gl.glNormal3f(0.0f,1.0f,0.0f);
        gl.glVertex3f(0.0f,0.0f,0.0f);
        gl.glVertex3f(0.0f,1.0f,0.0f);
        gl.glVertex3f(0.0f,1.0f,1.0f);
        gl.glVertex3f(0.0f,0.0f,1.0f);
      gl.glEnd();
      gl.glBegin(GL.GL_POLYGON);/* f6: right */
        gl.glNormal3f(0.0f,-1.0f,0.0f);
        gl.glVertex3f(1.0f,0.0f,0.0f);
        gl.glVertex3f(1.0f,0.0f,1.0f);
        gl.glVertex3f(1.0f,1.0f,1.0f);
        gl.glVertex3f(1.0f,1.0f,0.0f);
      gl.glEnd();
    }
}

Minimal version

Vi lager et minimalt program uten interaksjon. Urtgangspunktet er NetBeans javaproject: JOGL Application.

Den komplette koden i den eneste kodefila (foruten oneBox) er:

_Box1.java

Bruk av mus

Vi introduserer interaksjon ved å peke og dra med musa på tegningen Vi bruker det samme utgangspunktet med legger til MouseListener og MouseMotionListener.

Den komplette koden i den eneste kodefila (foruten oneBox) er:

_Box2.java

Bruk av dialogelementer

Vi introdusrere interaksjon via GUI-elementer, slidere, i vinduet. Dette prosjektet er bygd med utgangspunkt i NetBeans javaproject: JOGL Application (Form Designer, GL_JPanel)

Delere av hovedklassen:

_Box3.java

Den komplette koden i GLrenderer:

_GLRenderer.java

prosjekter

  • Minimal(JOGL/Netbeans): https://svnit.hiof.no/svn/psource/JOGL/box1
  • Mousing(JOGL/Netbeans): https://svnit.hiof.no/svn/psource/JOGL/box2
  • Handles(JOGL/Netbeans): https://svnit.hiof.no/svn/psource/JOGL/box3
Vedlikehold

B.Stenseth, april 2010

Å tegne:>Kloss
til toppen