Zaloguj się
Projekty Kategorie Archiwum
25 lipca

Dodanie obsługi OpenGL/3D za pomocą JOGL jest proste :) Wystarczy utworzyć obiekt GLCanvas, na którym wszystko jest rysowane, a następnie dodać GLEventListener. Z GLEventListener interesują nas głównie metody init, display i reshape.

  • init - wywoływane przy starcie programu

  • display - tutaj rysujemy naszego Dooma IV ;)

  • reshape - wywoływane przy starcie programu, oraz gdy zmieni się rozmiar okna

Przykładowy program

Free Image Hosting at www.ImageShack.us

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main extends JFrame implements GLEventListener {

	Main() {
		super("OpenGL Test");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(800, 600);
		setLocationRelativeTo(null);
		
		GLCanvas canvas = new GLCanvas();
		canvas.addGLEventListener(this);
		add(canvas);
		
		setVisible(true);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Main();
			}
		} );
	}

	// GLEventListener
	
	public void display(GLAutoDrawable drawable) {
		GL gl = drawable.getGL();
		gl.glClear(GL.GL_COLOR_BUFFER_BIT);

		// narysuj trójkąt
		gl.glBegin(GL.GL_TRIANGLES);
			gl.glColor3f(1.0f, 0.0f, 0.0f); // r
			gl.glVertex2f(0.0f, 1.0f);
			
			gl.glColor3f(0.0f, 1.0f, 0.0f); // g
			gl.glVertex2f(-1.0f, -1.0f);

			gl.glColor3f(0.0f, 0.0f, 1.0f); // b
			gl.glVertex2f(1.0f, -1.0f);
		gl.glEnd();
		
		gl.glFlush();
	}
	
	public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { }

	public void init(GLAutoDrawable drawable) {
		GL gl = drawable.getGL();
		System.err.printf("\tGL_VENDOR = %s\n", gl.glGetString(GL.GL_VENDOR));
		System.err.printf("\tGL_RENDERER = %s\n", gl.glGetString(GL.GL_RENDERER));
		System.err.printf("\tGL_VERSION = %s\n", gl.glGetString(GL.GL_VERSION));
		
		gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		gl.glDisable(GL.GL_DEPTH_TEST);
		// ...
	}

	public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
		GL gl = drawable.getGL();
		gl.glViewport(x, y, width, height);
		gl.glMatrixMode(GL.GL_PROJECTION);
		gl.glLoadIdentity();
		// ...
	}

}

Auto odświeżanie

Gdy robimy animację (np. w grze), to zawartość okna musi być co pewien czas automagicznie rysowana. Dzięki klasie FPSAnimator nie musimy się już zbytnio o to martwić :) Wystarczy w init umieścić:

FPSAnimator animator = new FPSAnimator(drawable, 25);
animator.start();

Teraz wszystko będzie odświeżane z szybkością 25 FPS, co powinno zapewnić płynność animacji, oraz małe zużycie procesora (przynajmniej teoretycznie ;)

Tekstury

Dodatkowo JOGL posiada kilka klas, które ułatwiają wczytywanie plików graficznych (np. TGA), oraz tworzenie tekstur.

Po więcej szczegółów odsyłam do projektu JOGL, gdzie można znaleźć dokumentację API oraz różnego rodzaju przykłady i dema :)

Proszę o komentarz

barret
Wtorek 7 sierpnia, 2007 20:26

swietne intro do jogla :)

jedna uwaga: zeby FPSAnimator zadzialal trzeba importowac import com.sun.opengl.util.FPSAnimator;

pozdro

niewiedzący
Czwartek 15 listopada, 2007 22:10

rysowany obiekt pojawia mi się tylko w pierwszej klatce animacji albo wcale :(. czy animator działa w ten sposób, że wywołuje przy rysowaniu klatki za każdym razem metodę dispaly() ? jeśli moja animacja ma się przesuwać o np zmienną x, to gdzie powinnam ją zwięszać ( x++ ) ? czy potrzeba do tego dodatkowej pętli?

barret
Środa 30 kwietnia, 2008 09:34

powinienes zwiekszac x w display().
moze zadzialal clipping i dlatego nic nie widac?

barret
Środa 30 kwietnia, 2008 09:34

przepraszam, powinnas ;)

misiu mietowy
Sobota 25 lipca, 2009 07:25

Próbowałem odpalić ten kod w Netbeans-ie i wywala mi błąd run-timeowy:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no jogl in java.library.path

pomimo, że mam do bibliotek dodane jary: jogl i gluegen-rt.

Czy wiecie jak można temu zaradzić?

Wtorek 28 lipca, 2009 10:53

Prawdopodobnie w opcjach projektu (Run / VM Options)
trzeba dodać:

-Djava.library.path=lib

gdzie "lib" to katalog z plikami natywnymi .so lub .dll JOGLa.. Ale nie pamiętam dokładnie jakie to były pliki ;)

Początkujący
Piątek 2 lipca, 2010 14:36

Mam bardzo naiwne pytanie:)

Programuje w JCreator i jak wkleiłem ten kod z tej strony
to mi nie znajduje bibliotek:
import com.sun.opengl.util.FPSAnimator;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;

Podejrzewam, że muszę coś zainstalować(pewnie te biblioteki openGL), ale nie mam pojęcia co i jak?
Dodam, że mam zainstalowane JDK 6 Update 20.
Bardzo proszę o jakąkolwiek pomoc :)

Sobota 3 lipca, 2010 14:37

Standardowo nie ma javax.media.opengl w JDK
i trzeba pobrać pliki "jar" ze strony JOGL-a.

Nie używam JCreatora, ale wydaje mi się,
że w opcjach projektu (?) powinno być miejsce,
gdzie można wskazać położenie plików .jar z javax.media.opengl.

Napisz komentarz

Dodaj komentarz

Formatowanie komentarza

Kategorie

Ewolucja Internetu 8 | Fail 40 | Gry 46 | Humor 129 | Idiotyzm 50 | Java 110 | KDE 85 | KShutDown 22 | Linux 84 | Makagiga 58 Muzeum 3 | Ogólne 819 | Polityka 76 | Programowanie 51 | Reklamy 4 | Techblog 19 | Teorie Spiskowe 12 | TV 59 | UI 9 | Użyteczność 30 | WWW 90 | Wyrwane z Kontekstu 34 | X Files 14

Archiwum

Maj 2012 | Kwiecień 2012 | Marzec 2012 | Luty 2012 | Styczeń 2012 | Grudzień 2011 | Listopad 2011 | Październik 2011 | Wrzesień 2011 | Sierpień 2011 | Lipiec 2011 | Czerwiec 2011 | Maj 2011 | Kwiecień 2011 | Styczeń 2011 | Listopad 2010 | Październik 2010 | Wrzesień 2010 | Sierpień 2010 | Lipiec 2010 | Czerwiec 2010 | Kwiecień 2010 | Marzec 2010 | Luty 2010 | Styczeń 2010 | Grudzień 2009 | Listopad 2009 | Październik 2009 | Wrzesień 2009 | Sierpień 2009 | Lipiec 2009 | Czerwiec 2009 | Maj 2009 | Kwiecień 2009 | Marzec 2009 | Styczeń 2009 | Grudzień 2008 | Listopad 2008 | Październik 2008 | Wrzesień 2008 | Sierpień 2008 | Lipiec 2008 | Czerwiec 2008 | Maj 2008 | Kwiecień 2008 | Marzec 2008 | Luty 2008 | Styczeń 2008 | Grudzień 2007 | Listopad 2007 | Październik 2007 | Wrzesień 2007 | Sierpień 2007 | Lipiec 2007 | Czerwiec 2007 | Maj 2007 | Kwiecień 2007 | Marzec 2007 | Luty 2007 | Styczeń 2007 | Grudzień 2006 | Listopad 2006 | Październik 2006 | Wrzesień 2006 | Sierpień 2006 | Lipiec 2006 | Czerwiec 2006 | Maj 2006 | Kwiecień 2006 | Marzec 2006 | Luty 2006 | Styczeń 2006 | Grudzień 2005 | Listopad 2005 | Październik 2005 | Wrzesień 2005 | Sierpień 2005 | Lipiec 2005 | Czerwiec 2005 | Maj 2005 | Kwiecień 2005 | Marzec 2005 | Luty 2005 | Styczeń 2005