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;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.
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) {
}
}
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.
Simples, não?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);
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);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.
animator.start();
Links:
- http://archsofty.blogspot.com/2009/05/jogl-java-bindings-for-opengl-api-with.html
- http://archsofty.blogspot.com/2009/05/tutorial-jogl-configuracao-do-ambiente.html
- 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:
Postar um comentário