Tutorial de Java OpenGL

Primeiramente me desculpem se já existe um tópico sobre isso, porém achei apenas o http://www.guj.com.br/java/276188-alguem-aqui-utiliza-opengl-com-java-jogl#1452970. Também sou novo no fórum e em java por isso não sei como usar muitos recursos do java e do fórum.

Estou trabalhando em um projeto que a ideia e usar OpenGL com java, porém não achei nenhum tutorial bom, os que eu achei da erro na hora de compilar, no tópico do link, diz que devemos tentar na raça, porém os comandos de OpenGL que conheço, eu tento converter porém diz que eu devo adicionar um cast ao gl, e o glut usado no opengl, no java openGL e o awt, porém não sei usá-lo com openGL(nem com java, só o actionListener, KeyListener, ActionEvent, etc.), então queria saber se algum de vocês conhecem algum bom tutorial de JOGL(Java OpenGL) ou se poderiam me ajudar a resolver o meu problema.
Se quiserem, o tutorial que eu peguei dava este programa(que da erro de compilação):

/**
 * Classe JanelaExemploJava2D, junto com a classe Renderer2D, mostra um exemplo de 
 * como trabalhar com Java e OpenGL utilizando a API JOGL. É aberta uma 
 * janela na qual é desenhado um triângulo.
 * 
 * @author Isabel H. Manssour e Marcelo Cohen  
 * @version 1.0
 */

import javax.swing.*;
import java.awt.*; 
import javax.media.opengl.*;

public class JanelaExemploJava2d
{
	private Renderer2D renderer;

	/**
	 * Construtor da classe ExemploJava que não recebe parâmetros. Cria uma janela e insere  
	 * um componente canvas OpenGL.
	 */
	public JanelaExemploJava2d()
	{
		// Cria janela
		JFrame janela = new JFrame("Desenho de um triângulo em 2D");   
		janela.setBounds(50,100,500,500); 
		janela.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

		BorderLayout layout = new BorderLayout(); 
		Container caixa=janela.getContentPane();
		caixa.setLayout(layout); 

		// Cria um objeto GLCapabilities para especificar o número de bits 
		// por pixel para RGBA
		GLCapabilities c = new GLCapabilities();
		c.setRedBits(8);
		c.setBlueBits(8);
		c.setGreenBits(8);
		c.setAlphaBits(8); 

		// Cria o objeto que irá gerenciar os eventos
		renderer = new Renderer2D();

		// Cria um canvas, adiciona na janela, e especifica o objeto "ouvinte" 
		// para os eventos Gl, de mouse e teclado
		GLCanvas canvas = new GLCanvas(c);
		janela.add(canvas,BorderLayout.CENTER);
		canvas.addGLEventListener(renderer);        
		canvas.addKeyListener(renderer);
		janela.setVisible(true);
		canvas.requestFocus();
	}

	/**
	 * 
	 * Método main que apenas cria um objeto ExemploJava.
	 */
	public static void main(String args[])
	{
		JanelaExemploJava2d ej = new JanelaExemploJava2d();
	}
}

E esse do Renderer2D

/**
 * Classe Renderer2D, junto com a classe JanelaExemploJava2D, mostra um exemplo de 
 * como trabalhar com Java e OpenGL utilizando a API JOGL. É aberta uma 
 * janela na qual é desenhado um triângulo.
 * 
 * @author Isabel H. Manssour e Marcelo Cohen  
 * @version 1.0
 */

import java.awt.event.*; 
import javax.media.opengl.*;
import javax.media.opengl.glu.*;

public class Renderer2D extends KeyAdapter implements GLEventListener
{
	// Atributos
	private GL gl;
	private GLU glu;
	private GLAutoDrawable glDrawable;

	/**
	 * Método definido na interface GLEventListener e chamado pelo objeto no qual será feito o desenho
	 * logo após a inicialização do contexto OpenGL. 
	 */    
	public void init(GLAutoDrawable drawable)
	{
		glDrawable = drawable;
		gl = drawable.getGL();     
		glu = new GLU();

		drawable.setGL(new DebugGL(gl));        

		gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
		
		// Define a janela de visualização 2D
		gl.glMatrixMode(GL.GL_PROJECTION);
		glu.gluOrtho2D(-1.0,1.0,-1.0,1.0);
		gl.glMatrixMode(GL.GL_MODELVIEW);
	}

	/**
	 * Método definido na interface GLEventListener e chamado pelo objeto no qual será feito o desenho
	 * para começar a fazer o desenho OpenGL pelo cliente.
	 */  
	public void display(GLAutoDrawable drawable)
	{
		gl.glClear(GL.GL_COLOR_BUFFER_BIT);
		gl.glLoadIdentity();    

		gl.glColor3f(0.0f, 0.0f, 1.0f);

		// Desenha um triângulo no centro da janela
		gl.glBegin(GL.GL_TRIANGLES);
			gl.glVertex3d(-0.5,-0.5, 0.0);
			gl.glVertex3d( 0.0, 0.5, 0.0);
			gl.glVertex3d( 0.5,-0.5, 0.0);
		gl.glEnd();                 
	}

	/**
	 * Método definido na interface GLEventListener e chamado pelo objeto no qual será feito o desenho
	 * depois que a janela foi redimensionada.
	 */  
	public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
	{
		gl.glViewport(0, 0, width, height);      
	}

	/**
	 * Método definido na interface GLEventListener e chamado pelo objeto no qual será feito o desenho
	 * quando o modo de exibição ou o dispositivo de exibição associado foi alterado.
	 */  
	public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { }

	/**
	 * Método definido na interface KeyListener que está sendo implementado que seja 
	 * feita a saída do sistema quando for pressionada a tecla ESC.
	 */        
	public void keyPressed(KeyEvent e)
	{
		switch (e.getKeyCode())
		{
			case KeyEvent.VK_ESCAPE:	System.exit(0);
										break;
		}  
		glDrawable.display();
	}

}

Meu sonho é que um dia eu abra um tópico desse e veja de fato alguém trazendo um tuto opengl e não pedindo por um, mas enfim…

A pergunta que não quer calar: você adicionou as referencias aos pacotes no seu projeto? Quais erros de compilação apareceram de fato(pode copiar e colar memso, só usa uma tag code)?

1 curtida

Eu usaria LWJGL no lugar de JOGL. O projeto tomou um caminho muito mais estável e maduro.

Além disso, evite abrir um tópico e dizer que esse programa “dá erro”. Que dá erro, todos sabíamos, senão você sequer teria aberto o tópico.
Diga qual erro de compilação dá.

Após colocar a OpenGL para funcionar, você pode seguir qualquer tutorial escrito para C++, pois as mudanças são mínimas, incluindo este, do Ponto V:
http://pontov.com.br/site/opengl

Aqui os erros de compilação, só de informação extra estou usando eclipse e nele já adicionei as bibliotecas(os .jar)

Os erros do Renderer2D

DebugGL cannot be resolved to a type
GL.GL_MODELVIEW cannot be resolved
GL.GL_PROJECTION cannot be resolved
The method glBegin(int) is undefined for the type GL
The method glColor3f(float, float, float) is undefined for the type GL
The method glEnd() is undefined for the type GL
The method glLoadIdentity() is undefined for the type GL
The method glVertex3d(double, double, double) is undefined for the type GL
The method glVertex3d(double, double, double) is undefined for the type GL
The method glVertex3d(double, double, double) is undefined for the type GL
The type Renderer2D must implement the inherited abstract method GLEventListener.dispose(GLAutoDrawable)

Os erros do JanelaExemploJava2d

GLCanvas cannot be resolved to a type
GLCanvas cannot be resolved to a type
The constructor GLCapabilities() is undefined

Vem cá, e não aparece tudo sublinhado de vermelho não? Todos esse erros de compilação geralmente tendem a ser sublinhados de e, caso haja uma solução para eles, o eclipse mostra uma lampadado lado do erro, é só clicar e ver as opções.

De toda forma, você entende o que você esses erros? “GLCanvas cannot be resolved to a type” sabe o que é isso? Significa que não foi encontrada nenhuma classe GLCanvas entre os pacotes que você importou. Eu fui lá na documentação e realmente entre os pacotes que você importou não existe essa classe. Olhá só:

http://jogamp.org/deployment/jogamp-next/javadoc/jogl/javadoc/

Clicando em “All classes” você vai ver que essa classes aí só tem em dois pacotes: o awt e o swt.

Tem algumas coisas que eu preciso que você entenda: primeiro, geralmente esses tutoriais são super antigos e defasados, então muita coisa você tem que adaptar na mão. Segundo, você tem que saber usar a documentação, quando tutoriais são escassos, documentação é tudo que sobra e você tem que se virar com isso(eu mesmo já passei mals bocados revirando documentação de cada classe até eu achar o que eu queria). Você está entrando em um terreno que programadores comuns não adentram, então provavelmente ninguém vai poder lhe ajudar em 90% do tempo. Terceiro: procure entender os erros, esse tipo de erro de compilação é até bem básico, as vezes copiar e colar só a parte genérica do erro no google já te dá uma ótima idéia do erro(tipo, joga no google “cannot be resolved to a type”, pronto, já dá pra entender o erro). Quarto: erros sublinhados geralmente tem os chamados quick fixes, onde você coloca o cursor em cima deles e aperta control+1 aparece uma lista com possíveis soluções dadas pela ide. Além disso, ao perceber que algumas classe não está dando certo, ou que um comando tem uma sintaxe diferente, use o control+espaço pra ver todos os comando daquele objeto,e quem sabe vislumbrar a sintaxe de um comando parecido com o que você queria.

Por último mais não menos importante, quando terminar cria um tutorial atualizado você mesmo, pra que ninguém tenha que passar pelo que você passou. Eu mesmo já pensei em tentar opengl, mas os problemas que eu citei me fizeram voltar atrás.

Por isso minha recomendação na LWJGL. É uma API mais atualizada e tem tutoriais mais atuais e funcionando.

Sem falar que ela permite alguns “import static” que vão deixar a sua sintaxe exatamente igual a de um programa OpenGL com C++ - permitindo que você siga qualquer tutorial de OpenGL escrito para essa linguagem (geralmente bem melhores e abundantes do que os para Java).

Agradeço a ajuda, resolvi alguns problemas, entre eles eu não achei a classe que esta alguns métodos, eu procurei no google, porém só acho esse métodos para OpenGL.
Obrigado, vou segui sua dica, estudar mais essa área para depois disponibilizar no fórum.
E mais um detalhe, alguém no fórum sabe em que classe estão os métodos:

		gl.glLoadIdentity();    
		gl.glColor3f(0.0f, 0.0f, 1.0f);
		gl.glBegin(GL.GL_TRIANGLES);
		gl.glVertex3d(-0.5,-0.5, 0.0);
		gl.glEnd();

Eu estou procurando, porém consigo encontrar.

O bom filho à casa torna.

Lembra da documentação que eu te passei? pois é, Lá no topo tem Overview Package Class Tree Deprecated Index Help

Clique em Index e espere carregar tudo(coisa de um minuto ou mais). aí você aperta ctrl+f e vai aparecer uma caixa de busca. Copia e cola o método(sem a parte dos parêntese, lógico) na caixa e manda buscar. Pronto, vai mostrar todos os métodos que tem com o nome que você tá procurando. Aí basta descobrir qual você está procurando.

Mais alguma dúvida pode postar.