Introdução à Opengl com Java
Introdução à Opengl com Java
SCC0250 - Computação Gráca
Prof. Fernando V. Paulovich
http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br
Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade de São Paulo (USP)
3 de março de 2013
Sumário
1 Instalando
2 OpenGL
2 / 23
Introdução à Opengl com Java Instalando
Sumário
1 Instalando
2 OpenGL
Instalando Plug-in Netbeans
Instale o Netbeans http://netbeans.org/
Faça download e instale o plug-in NetBeans OpenGL Pack http://plugins.netbeans.org/PluginPortal/faces/
PluginDetailPage.jsp;jsessionid=
92dc9baf4c97e0db77c57dbc8a32?pluginid=3260 Ferramentas -> Plug-ins -> Baixados -> Adicionar plug-ins
Desabilitar a instalação de GLSL editor e GLSL Compiler editor support
4 / 23
Introdução à Opengl com Java Instalando
Utilizando Bibliotecas
Outra forma de usar a JOGL é incluindo as bibliotecas necessárias
gluegen-rt.jar jogl.jar
E deixar visível as DLLs correspondentes (o mesmo vale para Linux)
glu32.dll gluegen-rt.dll glut32.dll jogl.dll opengl32.dll jogl_awt.dll jogl_cg.dll
Sumário
1 Instalando
2 OpenGL
6 / 23
Introdução à Opengl com Java OpenGL
Introdução
Application Programming Interface (API)
Coleção de rotinas que o programador pode chamar
Modelo de como estas rotinas operam em conjunto para gerar grácos
Programador enxerga apenas a interface
Não precisa lidar com aspectos especícos do hardware ou idiossincracias de software no sistema gráco residente (independente do dispositivo)
Oferece suporte para gerar e exibir cenas 3D complexas, e também para grácos 2D simples
OpenGL
Ambiente p/ escrever e executar programas grácos Monitor (tela) + biblioteca de software para desenhar primitivas grácas na tela
API pode ser vista como uma caixa preta
Entradas: Chamadas a funções da biblioteca feitas pelo programa do usuário; Medidas fornecidas por dispositivos de entrada; etc
Saídas: Os grácos exibidos no monitor
Descrita em termos das funções que disponibiliza
8 / 23
Introdução à Opengl com Java OpenGL
API OpenGL
Programa
Em geral, trabalha com um sistema de janelas (window system)
Inicializações: modo de exibição (display mode), janela de desenho e sistema de coordenadas de referência (associado à janela)
API oferece centenas de funções...
Diferentes funcionalidades Funções primitivas: o que Funções de atributos: como ...
Programação Dirigida a Eventos
Direcionada a eventos (event-driven)
programa responde a eventos: clique do mouse, tecla pressionada, redimensionamento da janela
10 / 23
Introdução à Opengl com Java OpenGL
Estados do OpenGL
OpenGL rastreia diversas variáveis de estado
Tamanho atual de um ponto, cor de fundo da janela, cor do desenho, etc.
O valor corrente permanece ativo até que seja alterado Tamanho de ponto: glPointSize(3.0)
Cor de desenho: glColor3f(red, green, blue) Cor de fundo: glClearColor(red, green, blue, alpha)
Limpar janela: glClear(GL_COLOR_BUFFER_BIT) os bits do color buer serão modicados para a cor de fundo
Programando
OpenGL é utilizada junto com outras bibliotecas auxiliares OpenGL Utility (GLU): denir a visão, matrizes de projeção, aproximação poligonal, desenho de superfícies, etc
OpenGL Utility Toolkit (GLUT): dene o sistema de janelas, e outras funções de desenho de superfície
12 / 23
Introdução à Opengl com Java OpenGL
Programando
Implementar a interface GLEventListener, responsável pelo desenho e outras funções
1 public classRendererimplementsGLEventListener { 2
3 public voidinit(GLAutoDrawable drawable) { 4 //inicializar o sistema
5 }
6
7 public voiddisplay(GLAutoDrawable drawable) { 8 //função de desenho
9 }
10
11 public voidreshape(GLAutoDrawable drawable,intx,int y,int←- width,int height) {
12 //função de redimensionamento
13 }
14
15 public voiddisplayChanged(GLAutoDrawable drawable,boolean←- modeChanged,booleandeviceChanged) {
16 //função para mudança no display }
Programando
Registrar o ouvinte em um painel e adicioná-lo em uma janela
1 //acelera o rendering
2 GLCapabilities caps =newGLCapabilities();
3 caps.setDoubleBuffered(true);
4 caps.setHardwareAccelerated(true);
5
6 //cria o painel e adiciona um ouvinte GLEventListener
7 GLCanvas canvas =new GLCanvas(caps);
8 canvas.addGLEventListener(new Renderer());
9
10 //cria uma janela e adiciona o painel
11 JFrame frame =new JFrame("Aplicação JOGL Simples");
12 frame.getContentPane().add(canvas);
13 frame.setSize(400, 300);
14 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15
16 //inicializa o sistema e chama display() a 60 fps
17 Animator animator =new FPSAnimator(canvas, 60);
18 frame.setLocationRelativeTo(null);
19 frame.setVisible(true);
20 animator.start();
14 / 23
Introdução à Opengl com Java OpenGL
Programando
Dene o método de inicialização
1 public void init(GLAutoDrawable drawable) {
2 GL gl = drawable.getGL();
3
4 gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //dene cor de fundo
5 gl.glMatrixMode(GL.GL_PROJECTION); //carrega a matriz de projeção
6 gl.glLoadIdentity(); //lê a matriz identidade
7
8 GLU glu = new GLU();
9 glu.gluOrtho2D(0.0, 200.0, 0.0, 150.0); //dene projeção ortogonal 2D
10 }
Programando
O pipeline da OpenGL é sempre 3D, mas é possível criar desenhos 2D, denindo
glMatrixMode(GL_PROJECTION) gluOrtho2D(0.0, 200.0, 0.0, 150.0)
16 / 23
Introdução à Opengl com Java OpenGL
Programando
OpenGL permite desenhar grácos de modo independente do dispositivo
É possível especicar o Sistema de Coordenadas do Mundo (ponto utuante) onde os objetos são denidos
Os elementos são traçados no Sistema de Coordenadas do Dispositivo, ou Sistema de Coordenadas da Tela (inteiro)
O mapeamento entre esses sistemas de coordenadas é feito de forma transparente pela OpenGL
Programando
Dene o método de desenho
1 public void display(GLAutoDrawable drawable) {
2 GL gl = drawable.getGL();
3
4 gl.glClear(GL.GL_COLOR_BUFFER_BIT); //desenha o fundo (limpa a janela)
5 gl.glColor3f(1.0f, 0.0f, 0.0f); //altera o atributo de cor
6
7 gl.glBegin(GL.GL_LINES); //desenha uma linha
8 gl.glVertex2i(10, 10);
9 gl.glVertex2i(190, 140);
10 gl.glEnd();
11
12 gl.glFlush(); //processa as rotinas OpenGL o mais rápido possível
13 }
18 / 23
Introdução à Opengl com Java OpenGL
Primitivas
Primitivas básicas
Pontos, linhas, poli-linhas, polígonos (GL_POINTS, GL_LINES, GL_POLYGON, etc.)
Para descrever um objeto, uma lista de vértices é informada
1 gl.glBegin(GL_POINTS);
2 gl.glVertex2i(100, 50); // desenha 3 pontos
3 gl.glVertex2i(100, 130);
4 gl.glVertex2i(150, 130);
5 gl.glEnd();
Primitivas
20 / 23
Introdução à Opengl com Java OpenGL
Outras Primitivas: Poli-linhas e Polígonos
Poli-linha: GL_LINE_STRIP, GL_LINE_LOOP seqüência de linhas conectadas... fechada ou não Outras primitivas
GL_TRIANGLES GL_QUADS
GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUAD_STRIP
Outras Primitivas: Poli-linhas e Polígonos
22 / 23
Introdução à Opengl com Java OpenGL
Exercício
Fazer um programa que desenhe alguma imagem 2D Esse programa deve possibilitar fazer zoom e pan