J2ME/Lições/M3G/No Canvas
Preparando um gráfico no Canvas
[editar | editar código-fonte]Primeiramente dentro da nossa classe de Canvas vamos incluir o pacote M3G que tem todas as classes e métodos para se trabalhar com gráficos 3D.
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
Vamos agora criar normalmente nossa classe de Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
}
Agora colocaremos o método paint() dentro da nossa classe de Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
}
}
E dentro do método paint() colocaremos o método repaint().
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
public void paint(Graphics meuGrafico){
repaint();
}
}
Iniciando o gráfico 3D no Canvas
[editar | editar código-fonte]Até agora fizemos todo o preparativo para receber um gráfico canvas 2D, vamos agora iniciar um objeto do tipo Graphics3D com o método getInstance() dentro da nossa classe de Canvas.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public void paint(Graphics meuGrafico){
repaint();
}
}
Agora iniciaremos o nosso gráfico 3D dentro do método paint(), para isso vamos usar o método bindTarget() da classe Graphics3D, e vamos usar como parâmetro o objeto da classe Graphics.
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
repaint();
}
}
Agora vamos terminar o processo de renderização do gráfico com o método releaseTarget() da classe Graphics3D, esse método deverá estar sempre APÓS a chamada do método bindTarget().
//arquivo ClasseMeuCanvas.java
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Exibindo um objeto em 3D no Canvas
[editar | editar código-fonte]Vamos agora ver como exibir um objeto já criado, primeiro crie o seu objeto em 3D em algum programa a sua escolha depois salve o seu arquivo na mesma pasta do arquivo ClasseMeuCanvas.java. O processo é um pouco parecido com o de exibição de uma imagem na tela.
Agora primeiramente vamos incluir o pacote java.io que contém o tratamento de exceção.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import java.microedition.m3g.*;
Agora vamos criar uma variável do tipo Object3D[].
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora vamos criar o construtor da classe ClasseMeuCanvas jogando a exceção IOException que é necessário para inciarmos o nosso objeto.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
ClasseMeuCanvas() throws IOException {
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora vamos inicializar o nosso objeto meuObjeto3D dentro do construtor, usando a classe Loader com o método load() que irá receber como parâmetro o endereço da localização do arquivo 3D que vamos carregar.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora poderíamos estar prontos para mostrar o objeto 3D na tela, mas calma, não é possível exibir objetos do tipo Object3D na tela, por isso devemos converter o nosso objeto meuObjeto3D para um tipo aceito para a renderização, nesse caso o tipo será da classe World que irá renderizar tudo dentro do nosso arquivo .m3g de uma vez, e que futuramente também será usado para modificar os atributos do arquivo .m3g. Por isso vamos primeiramente criar a nossa variável do tipo World.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora dentro do construtor após a inicialização do objeto meuObjeto3D vamos converter o tipo Object3D[] para o tipo World.
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.releaseTarget();
repaint();
}
}
Agora sim, podemos exibir o objeto que criamos na tela, para isso dentro do método paint(), no espaço entre os métodos bindTarget() e releaseTarget() ficará todas as ações do módulo 3D. Para isso vamos usar nosso objeto da classe Graphics3D() e entrar o método render() que irá receber como parâmetro o nosso objeto do tipo World (que convertemos previamente).
//arquivo ClasseMeuCanvas.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.m3g.*;
public class ClasseMeuCanvas extends Canvas {
Graphics3D meuGrafico3D = Graphics3D.getInstance();
Object3D[] meuObjeto3D;
World meuMundo;
ClasseMeuCanvas() throws IOException {
meuObjeto3D = Loader.load("/Meu Objeto 3D.m3g");
meuMundo = (World) meuObjeto3D[0];
}
public void paint(Graphics meuGrafico){
meuGrafico3D.bindTarget(meuGrafico);
meuGrafico3D.render(meuMundo);
meuGrafico3D.releaseTarget();
repaint();
}
}