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