sexta-feira, 2 de abril de 2010

jMonkeyEngine HelloWorld II

Você está na série de posts sobre jMonkeyEngine. Acesse o post principal: jMonkeyEngine Tutorial

Caso seja seu primeiro contato com jMonkeyEngine, leia antes o post jMonkeyEngine HelloWorld para aprender a configurar o ambiente e executar sua aplicação.

Com esse exemplo quero passar um pouco mais sobre jMonkeyEngine... sobre outras formas geométricas, como posicioná-las na tela (grafo de cena) e como alterar seu tamanho.

Crie uma classe chamada HelloWorldII com o código abaixo e execute-a. (Dúvidas quanto a isso? Leia jMonkeyEngine HelloWorld)

import com.jme.app.SimpleGame;
import com.jme.math.Vector3f;
import com.jme.scene.shape.Arrow;
import com.jme.scene.shape.Box;
import com.jme.scene.shape.Sphere;
import com.jme.scene.shape.Teapot;

public class HelloWorldII extends SimpleGame {

private Teapot teapot1;
private Teapot teapot2;

private Arrow arrow;
private Box box;
private Sphere sphere;

public static void main(String[] args) {
HelloWorldII app = new HelloWorldII();
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
app.start();
}

protected void simpleInitGame() {
//cria uma chaleira 3D
teapot1 = new Teapot("teapot1");
//move a chaleira (diminui 7 no eixo x, aumenta 2 no eixo y e 1 no eixo z)
teapot1.setLocalTranslation(new Vector3f(-7, 2, 1));
//aumenta o tamanho do objeto em duas vezes
teapot1.setLocalScale(2);
//Adiciona a chaleira na tela
rootNode.attachChild(teapot1);

//cria uma chaleira 3D
teapot2 = new Teapot("teapot2");
//move a chaleira (aumenta 3 no eixo x, diminui 2 no eixo y e não mexe no eixo z)
teapot2.setLocalTranslation(3, -2, 0);
//diminui o tamanho do objeto pela metade
teapot2.setLocalScale(0.5F);
//Adiciona a chaleira na tela
rootNode.attachChild(teapot2);

//vamos criar outros objetos 3D agora!

//cria uma seta de 3 de comprimento e 1 de largura
arrow = new Arrow("arrow", 3, 1);
//posiciona a seta no canto inferior esquerdo da tela
arrow.setLocalTranslation(-10, -5, 0);
//adiciona a seta na tela
rootNode.attachChild(arrow);

//cria uma caixa do ponto (x=0, y=0, z=0) até o ponto (x=2, y=2, z=2)
box = new Box("box", new Vector3f(0, 0, 0), new Vector3f(2, 2, 2));
//posiciona a caixa no canto inferior esquerdo da tela
box.setLocalTranslation(-8, -6, 0);
//adiciona a caixa na tela
rootNode.attachChild(box);

//cria uma esfera de raio 2
sphere = new Sphere("sphere", 30, 30, 2);
//posiciona a esfera no canto superior direito da tela
sphere.setLocalTranslation(4, 5, 0);
//adiciona a esfera na tela
rootNode.attachChild(sphere);
}
}

Você obterá algo semelhante a essas imagens:

jmonkeyengine hwii 1jmonkeyengine hwii 2


Explicando o código

Formas geométricas
Nesse exemplo foram utilizadas as seguintes formas: Teapot (Chaleira), Arrow (Seta), Box (Caixa, cubo), Sphere (Esfera, bola).

Teapot
Teapot é uma chaleira, para usar basta criar uma instância passando um nome qualquer:
Teapot teapot = new Teapot("teapot");
e depois adicionar na tela:
rootNode.attachChild(teapot);

Arrow
Uma seta, seu construtor recebe, um nome, o comprimento e a largura
Arrow arrow = new Arrow("arrow", 3, 1);
para visualizá-la é necessário adicionar o objeto na tela
rootNode.attachChild(arrow);

Box
Box representa uma caixa, um cubo, o seu construtor recebe um nome e dois vetores, o primeiro vetor representa onde a caixa começa, o segungo, onde ela termina
//cria uma caixa do ponto (x=0, y=0, z=0) até o ponto (x=2, y=2, z=2)
Box box = new Box("box", new Vector3f(0, 0, 0), new Vector3f(2, 2, 2));

Depois, basta adicionar à tela:
rootNode.attachChild(box);

Sphere
Utilizada para desenhar esferas, globos. Para criar é necessário passar ao construtor um nome, dois atributos que representam a circunferência da esfera e o raio:
Sphere sphere = new Sphere("sphere", 30, 30, 2);
jME não pode desenhar curvas, então desenha triângulos, utilizando muitos triângulos é possível desenhar uma esfera. Os dois primeiros números representam a proximidade dos triangulos, se você alterar de 30, 30 para 7, 7 você vai ver uma esfera como a abaixo:

7 x 730 x 30
jmonkeyengine esfera 7 7jmonkeyengine esfera 30 30

Quanto maior os números passados, mais esférico ficará o componente. Porém, números muito altos criam muitos triângulos, podendo deixar a aplicação pesada e lenta... é preciso encontrar um equilíbrio entre perfomance e aparência.

como sempre, é necessário adicionar na tela:
rootNode.attachChild(sphere);

Posicionamento
Mover objetos no cenário é simples, é só chamar o método setLocalTranslation.

Sphere sphere = new Sphere("sphere", 30, 30, 2);
sphere.setLocalTranslation(new Vector3f(0,2,0));


Um Vector3f, na jME API, tem o formato (x, y, z), então o código acima com Vector3f(0,2,0) movimenta o objeto duas unidades para cima (eixo y). Se eu tivesse usado Vector3f(0,-2,0) então a esfera teria sido movida duas unidades para baixo.

Mover objetos é realmente fácil. Você apenas tem que lembrar que x é direita/esquerda, y é cima/baixo, e z é trás/frente.

Alterar tamanho
Para alterar o tamanho de algum objeto o método setLocalScale é chamado.

Sphere sphere = new Sphere("sphere", 30, 30, 2);
sphere.setLocalScale(2);


Nele é passado quantas vezes maior ou menor você quer que o objeto fique, passando 2, o objeto fica duas vezes maior, passando 5, o objeto fica 5 vezes maior, passando 0.5, o objeto fica com metade do seu tamanho.


E é isso! Leia o post jMonkeyEngine Modelos 3D

2 comentários:

  1. legal a postagem! estou ancioso para ver a próxima sobre jMonkeyEngine, continue assim ;)

    ResponderExcluir
  2. Muito bom, ótima fonte sobre jmonkeyengine em português, tá tudo bem legível. Parabéns pelo blog!

    ResponderExcluir