domingo, 11 de abril de 2010

jMonkeyEngine Modelos 3D

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

Nesse post vou mostrar como utilizar objetos 3D na sua aplicação, veja algumas imagens de exemplo:

jmonkeyengine

jmonkeyengine











jMonkeyEngine não suporta qualquer tipo de formato de arquivo 3D diretamente, é preciso fazer uma conversão para um formato propritário chamado "jME binary", mas felizmente, a api do jMonkey tem classes e métodos que ajudam muito nessas conversões.

Vamos ver alguns exemplos:

Arquivos .obj
http://www.localhost8080.com.br/jmonkeyengine/model/ModelLoadingObj.java

Arquivos .x3d
http://www.localhost8080.com.br/jmonkeyengine/model/ModelLoadingX3d.java

Arquivos .xml
http://www.localhost8080.com.br/jmonkeyengine/model/ModelLoadingXml.java

OBS: Para usar essas classes você precisará dos arquivos que estão dentro desse zip:
http://localhost8080.com.br/jmonkeyengine/model/jmonkeyengine-modelo3d-assets.zip
Descompacte e jogue a pasta assets na pata src do seu projeto.

Performance
Quando você estiver construindo uma grande aplicação poderá ter problemas de performance, pois as conversões estão sendo feitas em tempo de execução (o arquivo .obj, por exemplo, é tranformado em .jme apenas quando o programa está rodando).

Isso pode ser resolvido convertendo todos os modelos 3D apenas uma vez e gravando-os em arquivos .jme utilizando FileOutputStreams, quando sua aplicação começar, basta ler esse arquivo com FileInputStream e carregá-lo diretamente, sem conversões. Isso deixará a aplicação muito mais rápida!

Bounding
Você viu em todos os exemplos desse artigo algo como a seguinte linha:
// cerca a imagem com limites invisiveis
spatial.setModelBound(new BoundingBox());
spatial.updateModelBound();

BoundingSphere e BoundingBox são a chave da performance em jME.
Por quê? Imagine uma imagem 3D complexa, leva-se muita tempo para carregá-la, fazer cálculos com ela, desenhá-la, etc... então, quando você tem uma imagem 3D, você cerca ela com uma esfera ou um quadrado (invisíveis), assim se o jME precisa saber se a imagem 3D está na visão da camera, para então carregá-la e desenhá-la, ele faz cálculos com a esfera ou quadrado ao redor da imagem, o que é rápido e fácil, pois esses objetos são matematicamente simples.

Use sempre este artifício! Basta decidir se o objeto, baseado em seu formato, deve ser cercado por uma esfera (BoundingSphere) ou por um quadrado (BoundingBox), e então usar isso para melhorar a performance do seu programa.


Vaaleu!! Em breve postarei mais sobre jMonkeyEngine, até mais!

Um comentário:

  1. Ola, bela iniciativa seu blog. Pouco se vê por ai coisas desse tipo.
    Para você fazer esses objetos 3D's, qual programa você usou? Tentei usar um objeto.obj convertido de uma objeto.blend, no programa blender mas não consegui converter a imagem.

    ResponderExcluir