Académique Documents
Professionnel Documents
Culture Documents
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
http://pt.wikipedia.org/wiki/Java_3D
Jorge Henrique Piazentin Ono
2 – Instalação do ambiente
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
http://netbeans.org/community/releases/69/
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
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);
}
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
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.
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
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
setVisible(true);
}
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
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
/**
*
* @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;
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
t3D.mul(transformAux);
tg.addChild(new ColorCube(0.3));
scene.addChild(tg);
scene.compile();
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
setVisible(true);
}
5 – Adicionando movimento
Para adicionar movimento à cena, temos que permitir que o TransformGroup modifique sua
transformação ao longo do tempo.
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.
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;
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);
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();
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
setVisible(true);
controleTimer = new Timer();
controleTimer.schedule(new Classe_Rotaciona(),0,100);
}
new Main();
}
}
Exemplo:
tTranslation.setTranslation(new Vector3f(3,3,3));
Jorge Henrique Piazentin Ono
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;
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
t3D.mul(transformAux);
t3DBall.setTranslation(new Vector3f(0.5f,0.0f,0.0f));
m.setEmissiveColor(0.0f,0.3f,1.0f);
tBall.addChild(s);
tg.addChild(tBall);
tg.addChild(new ColorCube(0.1));
t3DCone.setTranslation(new Vector3f(-0.5f,0.0f,0.0f));
tCone.addChild(con);
Jorge Henrique Piazentin Ono
tg.addChild(tCone);
iluminar();
scene.addChild(tg);
scene.compile();
simpleU.getViewingPlatform().setNominalViewingTransform();
simpleU.addBranchGraph(scene);
setVisible(true);
DirectionalLight light1 =
new DirectionalLight(white, light1Direction);
light1.setInfluencingBounds(bounds);
scene.addChild(light1);
}
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.
javac ObjLoad.java
java ObjLoad carro2.obj
Jorge Henrique Piazentin Ono
8 – Mais Informações
http://java.sun.com/developer/onlineTraining/java3d/