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 ) {} }
MhmHmH
Kiitos rakentavasta kommentista :D
Unohin sanoa aikoinani, että siistejä nämä Java + GFX -esimerkit, näitä lissää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.