Pesquisar

segunda-feira, 11 de maio de 2009

Tutorial Jogl - Desenhando em Java com Jogl 2D

Depois te fazer sua primeira tela usando o Jogl agora iremos para parte final desse tutorial.

Para desenharmos no Jogl iremos usar seus eventos. Há uma interface (GLEventListener) que devemos implementar se quisermos desenhar. Uma implementação nula (ou mock) pode ser vista abaixo:
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;


public class OuvinteJogl implements GLEventListener {
public void init(GLAutoDrawable arg0) {
}

public void display(GLAutoDrawable arg0) {
}

public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
}

public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {
}
}
Se concentre em dois métodos, o init e o display ambos recebem um GLAutoDrawable. Esse GLAutoDrawable será o nosso GLCanvas, assim as mudanças que faremos em GLAutoDrawable irão refletir diretamente no nosso GLCanvas.

Método init

Começemos então pelo método init que irá inicializar nosso desenho.
public void init(GLAutoDrawable drawable) {
int width = 512, height = 256;
GL gl = drawable.getGL();
GLU glu = new GLU();
gl.glClearColor(.0f, .0f, .0f, 1.0f);
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluOrtho2D(0.0, width, 0.0, height);
}
Aqui basicamente defini uma resolução (largura x altura). A segunda linha do méotodo é importantissíma veja como extrai o objeto GL (que na verdade é a API da OpenGl) e nele que iremos trabalhar diretamente com "a linguagem opengl". Esse GLU é uma biblioteca que nos ajuda nas tarefas rotineiras do opengl.

Depois de ter o contexto da opengl (gl) o código foi basicamente de inicialazação de um plano 2D (sem profundidade) na resolução dada.

Método display

Agora sim, nesse método que iremos criar o código para desenharmos a tv desintonizada usando o jogl.
public void display(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);

gl.glBegin(GL.GL_POINTS);
for (int x = 0; x < y =" 0;">
Simples. Aqui da mesma forma o primeiro passo é adiquirir o contexto da OpenGL (representado pelo objeto GL no java), limpar as cores gl.glClear(GL.GL_COLOR_BUFFER_BIT) e começar a desenhar pontos na tela. A logica é simples percorre-se dois for's uma para x e outro para y, a cada ponto uma cor é setada usando o método random da biblioteca Math (padrão do Java).

Agora pra juntar isso ao nosso JFrame anterior... ?
Simples basta ligar o nosso Listener ao Canvas.
super("OpenGl 2D - Java 2D com opengl Jogl");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(514, 258);
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new OuvinteJogl());
add(canvas);

Simples, não?
Execute e veja o resultado!


Mas perai... alguém me enganou! Isso não é animado...
É ai que entra o 3º Componente o FPSAnimator.
Ainda no construtor... escreva após a última linha de código existente nele.
FPSAnimator animator = new FPSAnimator(canvas, 50);
animator.start();
Agora execute e veja. (aquel 50 é o número de fps) Pronto igualzinho aquele tempo que a TV te dava canseira com o Super Nintendo e o Video Cassete.


Links:
  1. http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html
  2. http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html
  3. http://archsofty.blogspot.com/2009/05/tutorial-jogl-desenhando-em-java-com.html

Código Final Completo.
import com.sun.opengl.util.FPSAnimator;
import javax.media.opengl.GLCanvas;
import javax.swing.JFrame;

public class FrameJogl extends JFrame {

public static void main(String[] args) {
new FrameJogl().setVisible(true);
}

public FrameJogl() {
super("OpenGl 2D - Java 2D com opengl Jogl");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(514, 258);
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new OuvinteJogl());
add(canvas);
FPSAnimator animator = new FPSAnimator(canvas, 50);
animator.start();
}
}

import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;

public class OuvinteJogl implements GLEventListener {

public void init(GLAutoDrawable drawable) {
int width = 512, height = 256;
GL gl = drawable.getGL();
GLU glu = new GLU();
gl.glClearColor(.0f, .0f, .0f, 1.0f);
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluOrtho2D(0.0, width, 0.0, height);
}

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

gl.glBegin(GL.GL_POINTS);
for (int x = 0; x < 512; x++) {
for (int y = 0; y < 256; y++) {
gl.glColor3f((float)Math.random(), (float)Math.random(), (float)Math.random());
gl.glVertex2i(x, y);
}
}
gl.glEnd();
}

public void reshape(GLAutoDrawable drawable, int arg1, int arg2, int arg3, int arg4) {
}

public void displayChanged(GLAutoDrawable drawable, boolean arg1, boolean arg2) {
}
}

Nenhum comentário: