Você está na página 1de 17

Jorge Henrique Piazentin Ono

Apostila Java 3D
Jorge Henrique Piazentin Ono

Sumário
1 – Introdução.........................................................................................................................3
2 – Instalação do ambiente......................................................................................................4
3 – O primeiro programa em Java 3D.....................................................................................5
4 – Rotacionando o cubo colorido..........................................................................................8
5 – Adicionando movimento.................................................................................................10
6 – Iluminação, outras primitivas e materiais.......................................................................13
7 - Importando arquivos .obj.................................................................................................16
8 – Mais Informações............................................................................................................17
Jorge Henrique Piazentin Ono

1 – Introdução

O Java 3D é uma API de desenvolvimento de aplicações 2D e 3D para Java


baseada em grafos de cena. Além de apresentar um alto nível de abstração das
bibliotecas nativas, o Java 3D possibilita a utilização de conceitos da orientação a
objetos.

Para mais informações,

http://pt.wikipedia.org/wiki/Java_3D
Jorge Henrique Piazentin Ono

2 – Instalação do ambiente

O ambiente de desenvolvimento do Java 3D deve possuir, obrigatoriamente o


Java JDK, disponível no site da Sun e a API do Java 3D. Embora não obrigatória,
é altamente recomendável a instalação de um ambiente integrado, como Eclipse
ou NetBeans, pois eles possibilitam recursos como complemento de código e
documentação dos comandos do Java 3D. Nesta apostila, utilizaremos o
NetBeans.

Para a instalação do ambiente, seguir as instruções:

Fazer o download e instalar a máquina virtual Java e o JDK SE:

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-
Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u22-oth-JPR@CDS-
CDS_Developer

Fazer o download e instalar o NetBeans:

http://netbeans.org/community/releases/69/

Fazer o download e instalar o Java3D:

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-
Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=java3d-1.5.1-oth-
JPR@CDS-CDS_Developer
Jorge Henrique Piazentin Ono

3 – O primeiro programa em Java 3D

Primeiramente, é necessário criar um projeto NetBeans: Java -> Aplicativo Java

Em seguida, na classe principal do seu projeto, crie um JFrame para exibir o


canvas do Java 3D na tela.

Ex:
package javaapplication1;
import javax.swing.JFrame;
public class Main extends JFrame{
Main(){
super("Minha primeira aplicação Java 3D");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);
setVisible(true);
}

public static void main(String[] args) {


new Main();
}
}
Jorge Henrique Piazentin Ono

Agora, criamos a cena e o Canvas para serem adicionados ao JFrame.


GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);

BranchGroup scene = new BranchGroup();


scene.addChild(new ColorCube(0.3));
scene.compile();

SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

simpleU.getViewingPlatform().setNominalViewingTransform();

simpleU.addBranchGraph(scene);

SimpleUniverse é uma classe auxiliar que cria os principais componentes


necessários à exibição de um ambiente 3D na maioria das aplicações Java.

BranchGroup é um nó raiz, onde todos objetos e transformações 3D serão


adicionados.

Canvas3D é o componente visível, que deve ser adicionado à janela do usuário


para exibir a cena 3D.

ColorCube é uma classe que representa um cubo com cada face de uma cor
diferente. 0.3 é o tamanho (scale) que o cubo deverá ter em relação à janela.

O Código completo da aplicação fica assim:

package exemplo3d_1;

/**
*
* @author Jorge
*/

import com.sun.j3d.utils.universe.SimpleUniverse;

import com.sun.j3d.utils.geometry.ColorCube;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;

import javax.swing.JFrame;
public class Main extends JFrame{
Main(){
Jorge Henrique Piazentin Ono

super("Minha primeira aplicação Java 3D");


setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);

BranchGroup scene = new BranchGroup();


scene.addChild(new ColorCube(0.3));
scene.compile();

SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

simpleU.getViewingPlatform().setNominalViewingTransform();

simpleU.addBranchGraph(scene);

setVisible(true);
}

public static void main(String[] args) {


new Main();
}
}

Compile e execute o projeto. Uma caixa vermelha num fundo preto deverá ser
exibida. O programa completo está na pasta “exemplos” com o nome
“Exemplo_1.java”.
Jorge Henrique Piazentin Ono

4 – Rotacionando o cubo colorido

Abra o documento do código “Exemplo_1.java”.

Vamos rotacionar o cubo, aplicando uma transformação (classe TransformGroup e


Transform3D).

Para isso, criamos a transformação Transform3D, criamos o grupo TransformGroup,


adicionamos uma instância de ColorCube no TransformGroup e por fim adicionamos o
TransformGroup no nó raíz BranchGroup.

Observação: O Transform3D aceita apenas uma transformação por vez. Por isso, para
rotacionarmos no eixo X e Z, temos que criar dois Transform3D e multiplicarmos um pelo
outro.

Esquema:

BranchGroup

TransformGroup

ColorCube

Código completo (arquivo Exemplo_2.java)

/**
*
* @author Jorge
*/

import com.sun.j3d.utils.universe.SimpleUniverse;

import com.sun.j3d.utils.geometry.ColorCube;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
Jorge Henrique Piazentin Ono

import javax.swing.JFrame;

import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;

public class Main extends JFrame{


Main(){
super("Minha primeira aplicação Java 3D");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);

BranchGroup scene = new BranchGroup();


Transform3D t3D = new Transform3D();
Transform3D transformAux = new Transform3D();
t3D.rotX(45);
transformAux.rotZ(60);

t3D.mul(transformAux);

TransformGroup tg = new TransformGroup(t3D);

tg.addChild(new ColorCube(0.3));
scene.addChild(tg);
scene.compile();

SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

simpleU.getViewingPlatform().setNominalViewingTransform();

simpleU.addBranchGraph(scene);

setVisible(true);
}

public static void main(String[] args) {


new Main();
}
}
Jorge Henrique Piazentin Ono

5 – Adicionando movimento

Para adicionar movimento à cena, temos que permitir que o TransformGroup modifique sua
transformação ao longo do tempo.

Para isso, existe o método setCapability:

TransformGroup tg = new TransformGroup(t3D);

tg.addChild(new ColorCube(0.3));

tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ |
TransformGroup.ALLOW_TRANSFORM_WRITE);

Assim, podemos criar um Timer, e a cada vez que o método for executado, rotacionamos
um pouco o TransformGroup. Além disso, é necessário tornar público o TransformGroup,
para que ele fique acessível a toda classe.

Código completo (Exemplo_3.java):

import com.sun.j3d.utils.universe.SimpleUniverse;

import com.sun.j3d.utils.geometry.ColorCube;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;

import javax.swing.JFrame;

import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;

import java.util.Timer;
import java.util.TimerTask;

public class Main extends JFrame{

Timer controleTimer;

TransformGroup tg;

Transform3D t3D;

Main(){
super("Minha primeira aplicação Java 3D");
Jorge Henrique Piazentin Ono

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);

BranchGroup scene = new BranchGroup();


t3D = new Transform3D();
Transform3D transformAux = new Transform3D();
t3D.rotX(45);
transformAux.rotZ(60);

t3D.mul(transformAux);

tg = new TransformGroup(t3D);

tg.addChild(new ColorCube(0.3));

tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

scene.addChild(tg);
scene.compile();

SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

simpleU.getViewingPlatform().setNominalViewingTransform();

simpleU.addBranchGraph(scene);

setVisible(true);
controleTimer = new Timer();

controleTimer.schedule(new Classe_Rotaciona(),0,100);
}

class Classe_Rotaciona extends TimerTask{


public void run(){
Transform3D t2 = new Transform3D();
t2.rotY(0.1);
t3D.mul(t2);
t2.rotZ(0.1);
t3D.mul(t2);
tg.setTransform(t3D);
}
}

public static void main(String[] args) {


Jorge Henrique Piazentin Ono

new Main();
}
}

Observação: Outras transformações podem ser aplicadas ao Transform3D, como translação


e redimensionamento.

Exemplo:

Transform3D tScale = new Transform3D();

tScale.setScale(2); //multiplica por 2 o tamanho do TransformGroup;

Transform3D tTranslation = new Transform3D();

tTranslation.setTranslation(new Vector3f(3,3,3));
Jorge Henrique Piazentin Ono

6 – Iluminação, outras primitivas e materiais

No exemplo de código a seguir, vemos como modificar o material e adicionar outras


primitivas à cena. (Exemplo_4.java)
/**
*
* @author Jorge
*/

import com.sun.j3d.utils.universe.SimpleUniverse;

import com.sun.j3d.utils.geometry.ColorCube;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.geometry.Cone;
import com.sun.j3d.utils.geometry.Sphere;
import javax.media.j3d.AmbientLight;

import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;

import javax.swing.JFrame;

import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;

import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.DirectionalLight;

import javax.media.j3d.Material;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3f;

public class Main extends JFrame{

BranchGroup scene;

Main(){
super("Minha primeira aplicação Java 3D");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400,400);

GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Jorge Henrique Piazentin Ono

Canvas3D canvas3D = new Canvas3D(config);


add("Center", canvas3D);

scene = new BranchGroup();

Transform3D t3D = new Transform3D();;

Transform3D transformAux = new Transform3D();


t3D.rotX(45);
transformAux.rotZ(60);

t3D.mul(transformAux);

TransformGroup tg = new TransformGroup(t3D);

Transform3D t3DBall = new Transform3D();

t3DBall.setTranslation(new Vector3f(0.5f,0.0f,0.0f));

TransformGroup tBall = new TransformGroup(t3DBall);

Material m = new Material();

m.setEmissiveColor(0.0f,0.3f,1.0f);

Appearance app = new Appearance();


app.setMaterial(m);

Sphere s = new Sphere(0.2f,app );

tBall.addChild(s);
tg.addChild(tBall);

tg.addChild(new ColorCube(0.1));

Transform3D t3DCone = new Transform3D();

t3DCone.setTranslation(new Vector3f(-0.5f,0.0f,0.0f));

TransformGroup tCone = new TransformGroup(t3DCone);

Cone con = new Cone(0.1f, -0.2f, app);

tCone.addChild(con);
Jorge Henrique Piazentin Ono

tg.addChild(tCone);

iluminar();

scene.addChild(tg);
scene.compile();

SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

simpleU.getViewingPlatform().setNominalViewingTransform();

simpleU.addBranchGraph(scene);

setVisible(true);

private void iluminar(){


BoundingSphere bounds = new BoundingSphere(new Point3d(0,0,0), 100);
Color3f white = new Color3f(1.0f, 1.0f, 1.0f);

// Set up the ambient light


AmbientLight ambientLightNode = new AmbientLight(white);
ambientLightNode.setInfluencingBounds(bounds);
scene.addChild(ambientLightNode);

// Set up the directional lights


Vector3f light1Direction = new Vector3f(1.0f, 1.0f, 0.0f);

DirectionalLight light1 =
new DirectionalLight(white, light1Direction);
light1.setInfluencingBounds(bounds);
scene.addChild(light1);
}

public static void main(String[] args) {


new Main();
}
}
Jorge Henrique Piazentin Ono

7 - Importando arquivos .obj

A maioria dos modeladores possibilita que o designer exporte seu modelo para o formato
wavefront (obj). Para carregar um arquivo .obj numa cena Java 3D, devemos usar a classe
Loader.

Abaixo temos um exemplo (ObjLoad.java.java):

Obs.: Deve ser invocado assim (em linha de comando):

javac ObjLoad.java
java ObjLoad carro2.obj
Jorge Henrique Piazentin Ono

8 – Mais Informações

Para mais informações, veja o site oficial do Java 3D:

http://java.sun.com/developer/onlineTraining/java3d/