J2ME/Lições/M3G/No Canvas

< J2ME‎ | Lições‎ | M3G

Preparando um gráfico no Canvas editar

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

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

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();
    }
}