Java 3D –
Java 3D è una estensione standard di Java 2 jdk
(development kit)
E’ costituita da una gerarchia di classi utili nella creazione
di universi virtuali
Fornisce classi per
Creazione di immagini
Visualizzazione ed animazione
Applicazioni di grafica interattiva 3D
Introduction to Java3D
1
Java 3D
Un programma Java3D crea istanze di
oggetti Java3D e li posiziona in uno scene
graph
Lo scene graph è una struttura dati di oggetti
3D che specifica:
il contenuto di un universo virtuale
come tale contenuto deve essere renderizzato
I programmi Java3D possono essere scritti
sia come applicazioni sia come applet
Introduction to Java3D
2
Notazione
Visual object – si intende un oggetto nello scene
graph (cubo, sfera..)
Object – istanza di una classe
Content – oggetti visuali in uno scene graph nel
loro insieme, cioè contenuto visuale di una
immagine
Introduction to Java3D
3
Java 3d - API
Un programma Java 3d è costruito da oggetti –
istante di classi di Java 3D
La libreria Java 3D API è definita da oltre 100
classi presenti nel package javax.media.j3d
Queste classi sono dette il core di Java3D
Ogni classe contiene moltissimi campi e metodi
Generalmente per creare un semplice universo
virtuale può essere creato con poche classi
Introduction to Java3D
4
I package aggiuntivi
Oltre al core sono presenti altri package
come:
Il package com.sun.j3d.utils comunemente
chiamato le classi utility di Java3D
Il core contiene solo le classi di livello più
basso
Le classi utility sono “utili” aggiunte al
core
Introduction to Java3D
5
Classi di utility
Le classi di utility si dividono in quattro categorie:
caricatori di contenuti
classi di aiuto alla costruzione di scene graph
classi geometriche
classi di utility varie
Nuove funzionalità (ad esempio le NURBs) potranno
essere aggiunte alle classi di utility non al core
Alcune classi di utility potrebbero essere spostate nel
core nelle versioni successive
Introduction to Java3D
6
Classi di utility
2
L'utilizzo delle classi di utility riduce molto le
linee di codice di un programma Java3D
In aggiunta al core ed alle utility un programma
Java3D usa (quasi) sempre i package
java.awt e javax.vecmath
Il package javax.vecmath definisce le classi
punto, vettore, matrice ed altri oggetti matematici
Introduction to Java3D
7
General 3D Modelling Concepts
Un universo virtuale Java3D è creato tramite uno scene
graph - grafo della scena
Uno scene graph è creato usando istanze di classi Java3D
per definire:
geometria
suoni e luci
posizioni e orientamenti
Aspetti
di oggetti visuali o audio
La più comune relazione in uno SceneGraph è la
relazione parent –child (come in VRML)
Introduction to Java3D
8
Definizione di uno SceneGraph
(1)
SceneGraph è la struttura dati, utilizzata per
memorizzare, organizzare e render l‘informazione
di una scena (oggetti, materiali, luci...)
Un grafo è una struttura dati composta da nodi ed
archi:
I nodi in uno scene graph sono oggetti Java3D
Gli archi rappresentano due diversi tipi di relazione
tra oggetti:
Introduction to Java3D
relazione parent –child
relazione reference
9
Relazione
Relazione parent-child
Un nodo può avere più successori, ma un solo
predecessore
I nodi in relazione parent-child costituiscono
lo scene graph tree
Relazione reference
Una reference associa un node component
con uno scene graph node
Introduction to Java3D
10
Definizione di uno SceneGraph
(2)
I nodi più importanti di uno scene graph sono: Virtual Universe,
Locale, Groups, Leaf, NodeComponents
Introduction to Java3D
11
Simboli di uno Scene Graph
Nodes and Node Components (objects)
Arcs (object relationships)
VirtualUniverse
Locale - root
Group- scene graph
tree
Leaf - scene graph
tree
Parent-child link
Reference
Node Component
Other objects
Introduction to Java3D
12
Together a Locale and a
Virtual Universe compose
a SceneGraph superstructure.
A reference associates a Node
Component object with a Scene
Graph Node .
Introduction to Java3D
13
Scene Graph path
Uno scene graph è costituito da alberi aventi
radice nel nodo Locale
Vi è un unico cammino dal nodo Locale ad un
nodo Leaf
Ogni Scene graph tree path specifica
completamente lo stato della foglia cioè:
Posizione
Orientazione
Dimensione
Introduction to Java3D
14
Scene Graph path
2
Gli attributi visuali di ciascun oggetto
visuale dipendono solo dal suo Scene
Graph path
Il sistema di rendering di Java 3D esegue il
render delle foglie nell’ordine che ritiene
più efficiente
Introduction to Java3D
15
Gerarchia delle classi di Java 3D API
Introduction to Java3D
16
Important Classes
Virtual Universe and Locale Class
SceneGraph Object Class
è la classe base per ogni oggetto che appare in uno Java3D scene Graph.
Questa classe astratta contiene oggetti node and node component
Scene Graph Viewing Object Classes
include 5 classi usate per gestire i parametri di viewing di uno scene graph
(Canvas3D,Screen3D,View,PhysicalBody,PhysicalEnvironment)
Simple Universe utility class
usata per creare un programma Java3D senza trattare con le Viewing object
Classes
Introduction to Java3D
17
Classe Node
Node è la superclasse astratta delle
classi Group e Leaf
Definisce importanti metodi comuni alle
sue sottoclassi
Le sottoclassi di Node costruiscono
uno scene graph
Introduction to Java3D
18
Scenegraph nodes
Vi sono 2 tipi di nodi:
- Group : il ruolo primario di un
nodo Group è di essere
parent di altri nodi- Group e
Leaf
- Leaf : i nodi leaf specificano
shape, sound, and behavior di
un visual object.
Introduction to Java3D
19
Classe Group
Group è la superclasse usata per specificare
posizioni ed orientamenti degli oggetti nell'universo
virtuale
Sottoclassi della classe Group sono
BranchGroup
TransformGroup
……
Nella rappresentazione grafica dello scene graph,i
simboli di Group (cerchi) sono indicati con BG per
BranchGroup e TG per TransformGroup
Introduction to Java3D
20
Group nodes subclasses
BranchGroup
OrderedGroup
Group
SharedGroup
Switch
TransformGroup
Primitive
Introduction to Java3D
21
Classe Leaf
Leaf è la superclasse usata per specificare:
Alcune sottoclassi sono:
forme e aspetti
suoni
comportamenti
Shape3D, Light,
Behavior e Sound
Un nodo Leaf non può avere successori, ma
reference ad oggetti NodeComponent
Introduction to Java3D
22
Leaf nodes Subclasses
Background
Behavior
Bounding Leaf
Clip
Leaf
Fog
Light
Link
Morph
Shape3D
Sound
Soundscape
Introduction to Java3D
Viewplatfom
23
Node Component
La classe Node Component class è usata per specificare una varietà
di proprietà di un nodo Shape3D, quali
Geometria
Texture
Trasparenza
Colore
Alcune classi sono
Appeareance
Coloring Attributes
DepthComponent Geometry
ImageComponent....
Un NodeComponent può essere collegato a più di un nodo
Shape3D
Introduction to Java3D
24
Esempio
Un oggetto Virtual Universe è collegato a uno o più oggetti
Locale. All‘oggetto locale sono associati 2 BranchGroup
ContentBranch descrive il contenuto della scena
ViewBranch descrive osservatore, piano immagine..
ContentBranch
graph
Introduction to Java3D
ViewBranch
graph
25
Java3D API
The API has core classes and utility classes
Core Classes
javax.media.j3d package
lowest level classes
required for Java3D
programming
Introduction to Java3D
Utility Classes
com.sun.j3d.utils package
convenient and powerful
additions to the core
26
Passi per scrivere un programma
Creare gli oggetti Canvas3D e VirtualUniverse
Creare un oggetto Locale e collegarlo al
VirtualUniverse
Costruire un view branch graph
Creare gli oggetti View, ViewPlatform,
PhysicalBody e PhysicalEnvironment
Collegare ViewPlatform, PhysicalBody,
PhysicalEnvironment e Canvas3D alla View
Costruire uno o più content branch graph
Compilare tutti i branch graph
Collegare tutti i branch graph al Locale
Introduction to Java3D
27
Simple recipe for writing a Java3D
program
Using the SimpleUniverse class in Java 3D program reduces the time and effort needed
to create the view branch Graph.
The basic outline of Java 3D program development consists of seven steps :
1- Create a Canvas3D object
2- Create a VirtualUniverse object
3- Create a Locale object, attaching it to the VirtualUniverse object .
4- Construct a View object
5- Construct content branch graph
6- Compile branch graph
7- Insert subgraphs into the Locale.
The steps 1,2,3,4,and 7 create a Simple Universe( code for creating a SimpleUniverse:
SimpleUniverse ( ) )
Introduction to Java3D
28
HelloJava3D Class
public class HelloJava3Da extends Applet {
public HelloJava3Da() {
setLayout(new BorderLayout());
1- Create a
canvas3D
GraphicsConfiguration config =
SimpleUniverse .getPreferredConfiguraton( );
Canvas3D canvas3D = new Canvas3D (config) ;
4- Compile
ContentBranch add("Center“, canvas3D);
Graph
BranchGroup scene = createSceneGraph();
2- Create a
scene.compile();
Simpleuni
// SimpleUniverse is a convenience Uility class
verse
SimpleUniverse SimpleU = new SimpleUniverse (canvas 3D) ;
// This move the ViewPlatform back a bit so the
3- Customize
// objects in the scene can be viewed .
Simpleuniverse
SimpleU.getViewingPatform().setNominalViewingTransform();
simpleU.addBranchGraph (scene);
5- Insert
} // end of HelloJava 3Da (constuctor)
Introduction to Java3D
ContentBranchGraph
into the Locale
29
SimpleUniverse
SimpleUniverse è un oggetto che crea uno scene graph contenente un
oggetto VirtualUniverse, un oggetto Locale ed un completo view
branch graph
Il view branch graph creato da un SimpleUniverse usa oggetti
ViewingPlatform e Viewer al posto delle classi core utilizzate per
creare il view branch graph
Il package com.sun.j3d.utils.universe contiene le classi di utility
SimpleUniverse
ViewingPlatform
Viewer
Introduction to Java3D
30
SimpleUniverse
Introduction to Java3D
31
SimpleUniverse constructors
Introduction to Java3D
32
Passi per scrivere un programma
Creare un oggetto Canvas3D
Creare un oggetto SimpleUniverse e collegarlo all’oggetto
Canvas3D
Personalizzare l'oggetto SimpleUniverse
Costruire uno o più content branch graph
Compilare tutti i content branch graph
Collegare tutti i content branch graph al Locale del
SimpleUniverse
Introduction to Java3D
33
Piano immagine
Il SimpleUniverse crea un view branch graph completo contenente
anche un image plate cioè
la finestra 2D su cui l'universo virtuale viene proiettato e renderizzato
Un oggetto Canvas3D può essere pensato come un image plate
Il piano immagine
è centrato nell'origine dell'universo
con l’asse z uscente dallo schermo,
l’asse x orizzontale con i valori positivi a destra
l’asse y verticale con i valori positivi in alto
Introduction to Java3D
34
Piano immagine
Introduction to Java3D
35
HelloJava3D
package it.unict.dmi.cg.HelloJava3D;
import java.awt.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.swing.*;
// Visualizza un cubo immobile
public class HelloJava3D_a1 extends JFrame
{
public HelloJava3D_a1()
{
//Recupera le configurazioni grafiche del computer
GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration();
//Crea un oggetto Canvas3D e lo aggiunge al frame
Canvas3D canvas3D=new Canvas3D(config);
this.getContentPane().add(canvas3D,BorderLayout.CENTER);
Introduction to Java3D
36
HelloJava3D
//Crea la scena
BranchGroup scene=createSceneGraph();
//Crea il SimpleUniverse
SimpleUniverse simpleU=new SimpleUniverse(canvas3D);
//Questo comando serve per spostare leggermente indietro il sistema di riferimento
// il metodo setNominalViewingTransform posiziona il punto di vista in (0,0,2.41)
simpleU.getViewingPlatform().setNominalViewingTransform();
//Compila la scena (subito prima di renderla viva)
scene.compile();
//Aggiunge la scena all'universo
simpleU.addBranchGraph(scene);
}
Introduction to Java3D
37
HelloJava3D
//Crea la scena
private BranchGroup createSceneGraph()
{
//Crea la radice del branch graph
BranchGroup objRoot=new BranchGroup();
//Aggiunge alla radice un cubo colorato
objRoot.addChild(new ColorCube(0.4));
return objRoot;
}
public static void main(String[] args)
{
HelloJava3D_a1 hello=new HelloJava3D_a1();
hello.setTitle("Hello Java3D!");
hello.setSize(300,300);
hello.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
hello.show(); } }
Introduction to Java3D
38
Terminologia
„Become live“ :
Un Branch Graph diventa live appena è collegato ad un oggetto
Locale. Ciascun oggetto di un Branch Graph live è soggetto ad essere
renderizzato
Compiling
La compilazione di un BranchGroup converte un oggetto ed i suoi
successori in una forma più efficiente per il rendering
Introduction to Java3D
39
Performance
La rappresentazione di uno scene graph costruito
da Java3D non è molto efficiente
La flessibilità nel realizzare universi virtuali
offerta dallo scene graph viene pagata in termini
di prestazioni
Per tale motivo Java3D utilizzata internamente
una rappresentazione più efficiente per migliorare
le prestazioni di rendering
Introduction to Java3D
40
Invocando il metodo
compile() per un oggetto
BranchGroup, si ottiene
che tale oggetto sia
convertito in una
rappresentazione interna
più efficiente
Performance
Introduction to Java3D
41
Capability
La conversione in una rappresentazione
interna ha degli “effetti collaterali”
Un effetto è quello di bloccare i valori delle
trasformazioni affini ed altri oggetti dello
scene graph
Se non specificato prima, il programma
non avrà più modo (capability) di cambiare
i valori di tali oggetti
Introduction to Java3D
42
Capability
Ci sono casi in cui un programma ha la necessità
di cambiare tali valori anche dopo che gli oggetti
siano diventati vivi
Per esempio, è possibile creare animazioni
cambiando i valori di un TransformGroup
L’oggetto TransformGroup deve essere in grado di
cambiare anche dopo essere diventato vivo
Introduction to Java3D
43
Capability
Capability: caratterista di un oggetto che
può essere modificata
Un oggetto può avere un insieme di
capability
Impostando o azzerando una capability si
decide se una particolare caratteristica può
essere modificata dopo che l'oggetto è
diventato vivo
Introduction to Java3D
44
Trasformazioni in Java3D
La classe TransformGroup Class è necessaria per
rappresentare la trasformazione di un oggetto
Transfom3D
Operazioni base:
- Traslazione : muovere un oggetto da una posizione ad
un‘altra
- Rotazione : un oggetto può essere ruotato attorno ad una
combinazione di assi X,Y,Z contemporaneamente
- Scaling: un oggetto può variare la sua dimensione
Introduction to Java3D
45
Key Java3D features
Java 3D scene graphs sono considerevolmente più difficili
degli scene graph di VRML, per la complessità di un
linguaggio di programmazione come Java
Ma Java3D sceneGraph offre eccellenti caratteristiche
quali:
- Rendering control
- Scalable Performance
- Behaviors
- Generic Input Devices
- Geometry Compresion
- Versatile View Model
- Camera-based View Model
Introduction to Java3D
46
References
Getting starting with Java3D API (Dennis
J Bouvier) „ The Java3D Tutorial of Sun“
Java website
http://java.sun.com/products/javamedia/3D
http://www.sun.com/desktop/java3d
http://java.sun.com/javase/technologies/desktop/
http://wiki.java.net/bin/view/Javadesktop/Java3D
Introduction to Java3D
47