Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: JOGL Kuutio

Turatzuro [03.01.2006 13:57:16]

#

Eli tällainen simppeli kieppuva kuutio java+opengl:llä toteutettuna. Kunnollisia jogl-simerkkejä ei netistä näytä mahdottomasti löytyvän, joten ajattelin heittää tämän saataville.

Käyttää JOGL-kirjastoa, joka on saatavilla osoitteesta http://jogl.dev.java.net/.

import java.awt.*;
import java.awt.event.*;
import net.java.games.jogl.*;

public class JOGLCube {
    public static void main(String[] args) {
        Frame frame = new Frame();
        frame.setTitle("JOGLCube");

        // Näytönohjaimen ominaisuudet
        GLCapabilities glCaps = new GLCapabilities();

        // 32bit värit
        glCaps.setRedBits(8);
        glCaps.setGreenBits(8);
        glCaps.setBlueBits(8);
        glCaps.setAlphaBits(8);

        /*
         Luodaan opengl-komponentti ja lisätään se swing-ikkunaan.
         Swing-ikkunaa varten täytyy luoda GLJPanel-komponentti, AWT:tä
         varten taas GLCanvas. Tässä käytetään GLJPanelia.
         */
        GLJPanel glPanel = GLDrawableFactory.getFactory().createGLJPanel(glCaps);
        final Animator animator = new Animator(glPanel);
        frame.add(glPanel, BorderLayout.CENTER);
        glPanel.addGLEventListener(new OmaGLEventListener());

        // Listeneri ikkunan sulkemista varten
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                animator.stop();
                System.exit(0);
            }
        });

        // Asetetaan ikkunan koko ja määritetään koko kiinteäksi
        frame.setSize(400, 400);
        frame.setResizable(false);

        // Asetetaan frame näkyväksi _ennen_ animaattorin starttaamista
        frame.setVisible(true);
        animator.start();
    }
}
import net.java.games.jogl.*;

public class OmaGLEventListener implements GLEventListener {
    private GL gl;
    private double angle;

    // Initialisoidaan komponentti. Tämä suoritetaan vain kerran.
    public void init(GLDrawable drawable) {
        gl = drawable.getGL();

        // Syvyystestaus
        gl.glEnable(GL.GL_DEPTH_TEST);

        // Tallennetaan koko kuvio listaan (1), jolloin se on helppo kutsua
        gl.glNewList(1, GL.GL_COMPILE);
        // Piirretään neliöitä
        gl.glBegin(GL.GL_QUADS);

        /*
         Seuraavilla pirretään kuution kaikki 6 sivua.
         Sivulle annetaan ensin väri metodilla glColor3d(r,g,b), jonka jälkeen
         piirretään sivun kaikki neljä kärkeä metodilla glVertex3d(x,y,z).
         Kannattaa huomata, että kärkiä ei määrätä pikseleinä, vaan
         relatiivisina pisteinä. Kun objekti on valmis, se voidaan myöhemmin
         skaalata oikean kokoiseksi.
         */

        gl.glColor3d(1, 0, 0); // Punainen
        gl.glVertex3d( -1.0, 1.0, -1.0);
        gl.glVertex3d( -1.0, -1.0, -1.0);
        gl.glVertex3d(1.0, -1.0, -1.0);
        gl.glVertex3d(1.0, 1.0, -1.0);

        gl.glColor3d(0, 1, 0); // Vihreä
        gl.glVertex3d( -1.0, 1.0, 1.0);
        gl.glVertex3d( -1.0, -1.0, 1.0);
        gl.glVertex3d(1.0, -1.0, 1.0);
        gl.glVertex3d(1.0, 1.0, 1.0);

        gl.glColor3d(0, 0, 1); // Sininen
        gl.glVertex3d( -1.0, 1.0, 1.0);
        gl.glVertex3d( -1.0, 1.0, -1.0);
        gl.glVertex3d(1.0, 1.0, -1.0);
        gl.glVertex3d(1.0, 1.0, 1.0);

        gl.glColor3d(1, 1, 0);
        gl.glVertex3d( -1.0, -1.0, 1.0);
        gl.glVertex3d( -1.0, -1.0, -1.0);
        gl.glVertex3d(1.0, -1.0, -1.0);
        gl.glVertex3d(1.0, -1.0, 1.0);

        gl.glColor3d(0, 1, 1);
        gl.glVertex3d( -1.0, 1.0, -1.0);
        gl.glVertex3d( -1.0, -1.0, -1.0);
        gl.glVertex3d( -1.0, -1.0, 1.0);
        gl.glVertex3d( -1.0, 1.0, 1.0);

        gl.glColor3d(1, 0, 1);
        gl.glVertex3d(1.0, 1.0, -1.0);
        gl.glVertex3d(1.0, -1.0, -1.0);
        gl.glVertex3d(1.0, -1.0, 1.0);
        gl.glVertex3d(1.0, 1.0, 1.0);

        gl.glEnd();
        gl.glEndList();
    }

    // display-metodia suoritetaan uudelleen ja uudelleen kunnes ohjelma
    // lopetetaan tai animaattori suljetaan.
    public void display(GLDrawable drawable) {
        // Musta tausta, tyhjennetään puskurit, asetetaan moodi, reset
        gl.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

        // Skaalataan kuutio halutun kokoiseksi
        gl.glScaled(0.4, 0.4, 0.4);

        // Muutetaan kulmaa
        angle += 0.4;

        // Liikutetaan kameraa metodilla glRotated(x,y,z),
        // jonka jälkeen kutsutaan kuvio listasta 1
        gl.glRotated(angle, 0.4, 0.7, 0.8);
        gl.glCallList(1);
    }

    // Tätä kutsutaan kun komponentin kokoa muutetaan. Ei tarvetta tässä.
    public void reshape(
            GLDrawable drawable,
            int x,
            int y,
            int width,
            int height
            ) {}

    // Kun värisyvyys muuttuu, kutsutaan tätä. Ei tarvetta tässä.
    public void displayChanged(
            GLDrawable drawable,
            boolean modeChanged,
            boolean deviceChanged
            ) {}
}

Nannohiiri [16.01.2006 21:33:21]

#

MhmHmH

Turatzuro [08.02.2006 21:53:48]

#

Kiitos rakentavasta kommentista :D

tsuriga [24.10.2007 01:27:54]

#

Unohin sanoa aikoinani, että siistejä nämä Java + GFX -esimerkit, näitä lissää.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta