Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API...

29
Java 3D

Transcript of Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API...

Page 1: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Java 3D

Page 2: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 2 di 29

Cos’è Java 3D

• Java 3D è un API grafica 3d ad alto livello.– Il programmatore lavora con costrutti di alto livello

con cui crea e manipola oggetti 3D.

• Il rendering è gestito in modo automatico.– Sfruttando thread e metodi di ottimizzazione il motore

si rendering migliora le prestazioni.

• Gli oggetti creati risiedono in un “Universo virtuale”

Page 3: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 3 di 29

Package

• Il core– La libreria fornisce oltre 100 classi presenti nel

package javax.media.j3d

• Utility– Oltre al core sono presenti altri package tra cui

com.sun.j3d.utils. L’utilizzo di queste classi permette di ridurre le linee di codice di un programma 3D

• Altre classi utili– java.awt : per gli elementi 2d.– java.vecmath : per punti, linee, matrici e altre classi

matematiche.

Page 4: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 4 di 29

Universo virtuale

• Come detto gli oggetti java3D sono inseriti in un Universo virtuale che viene creato tramite uno “scene graph”.

• Uno scene graph è una struttura ad albero composta da nodi e archi.– I nodi rappresentano oggetti java3D

– Gli archi rappresentano le relazioni tra gli oggetti• relazione padre-figlio

• reference

Page 5: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 5 di 29

Un esempio di “Scene Graph”

BG

Apparance

BG

TG

GeometryGeometry

Canvas3D Screen3DS

TG

S

TG

View

Universo Virtuale

Locale

Nodi BranchGroups

Nodi TrasformGroups

NodeComponent

View Platform

Physical Body Physical Enivironment

Page 6: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 6 di 29

SimpleUniverse

• Per ridurre le operazione da eseguire è possibile usare la classe SimpleUniverse.

• Questa classe permette di alleggerire la procedura di creazione dell’universo virtuale.

• Per usare il SimpleUniverse è necessario:– Creare un oggetto Canvas3D– Creare un oggetto SimpleUniverse e collegarlo al

Canvas3D– Costruire e compilare i BranchGroups– Collegare quest’ultimi al Locale del SimpleUniverse

Page 7: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 7 di 29

Il piano di rendering

• Il SimpleUniverse crea un view contenente anche un image plate.

• Un image plate è il rettangolo dove l’universo viene proiettato e renderizzato– Il Canvas3D può essere pensato come un image plate.

– L’image plate è centrato nell’origine con asse z uscente dallo schermo, asse x orizzontale verso destra, asse y verticale verso l’alto

Page 8: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 8 di 29

Classi

• Alcune classi :– Node : superclasse astratta che rappresenta ogni nodo dello scene

graph.

– Group : supereclasse usata per specificare posizioni e orientamenti degli oggetti.sottoclassi comuni: BranchGroup, TransformGroup.

– Leaf : superclasse usata per specificare forme, aspetti, suoni, comportamenti.non hanno figli, ma riferimenti a NodeComponent.

– NodeComponent : superclasse usata per specificare geometrie, aspetto, texture, materiale.non sono parte dello scene graph ma sono collegate tramite reference. Possono essere collegate a più di un nodo.

Page 9: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 9 di 29

La classe Shade3D

• Shade3D è una sottoclasse di Leaf, quindi può essere solo una foglia dello scene graph.

• Un nodo Shade3D rappresenta un oggetto visuale.

• Non contiene informazioni su forma e colore.– queste vengono conservate negli oggetti

NodeComponent collegate allo Shade3D.

Page 10: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 10 di 29

Geometry e Classi matematiche

• La classe Geometry o sue sottoclassi descrivono primitive basate sui vertici, come punti, linee, poligoni.

• Per definire un vertice sono necessarie le classi matematiche che rappresentano:– Point* : coordinate dei vertici.– Color* : colore di un vertice, una proprietà di un

materiale, una nebbia, ecc.– Vector* : vettori, usati per le normali ai vertici,

direzioni sorgenti di luce, traslazioni.– TextCood* : coordinate di una texture ad un vertice.

Page 11: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 11 di 29

Aspetto ed Attributi (Apparance)

• I dati di una Geometry, spesso sono insufficienti per descrivere l’aspetto di un oggetto: è necessario utilizzare la classe Apparance

• Un oggetto Apparance non contiene le informazioni sull’aspetto dello Shade3D ma referenzia sottoclassi di NodeComponent (gli attributi), dove sono memorizzate tali informazioni.

• Gli oggetti referenziabili possono essere:– PointAttributes/LineAttributes/PolygonAttributes– ColoringAttributes/ TrasparencyAttributes– RenderingAttributes/Material– TextureAttributes/Texture/TexCoordGenerator

Page 12: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 12 di 29

Condivisione di Attributi

• È possibile che due oggetti Shade3D facciano riferimento allo stesso Apparance.

• È possibile che due oggetti Apparance facciano riferimento allo stesso attributo.

• La condivisione può migliorare le performance.

ApparanceGeometry

Geometry

S S

Apparance Geometry

S

Material LineAttributesColoringAttributes

Page 13: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 13 di 29

Alcuni Attributi

• PointAttributes : gestisce il rendering dei punti.

• LineAttributes : gestisce il rendering delle linee.

• PolygonAttributes : gestisce il rendering dei poligoni.– Per default il poligono è pieno.

• ColoringAttributes : controlla la colorazione degli oggetti.– Se il colore è definito anche nella geometry, prevale quello della

geometry.

• TrasparencyAttributes : gestisce la trasparenza.– 0.0 opaco, 1.0 trasparente– SCREEN_DOOR : alcuni pixel sono completamente opachi.– BLENDED : ogni pixel ha la trasparenza impostata.

Page 14: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 14 di 29

Bound

• Un bound definisce una regione dove un nodo agisce.

• Un bound è definito usando le classi:– BondingSphere : il più semplice, crea boun sferici.– BoundingBox : crea bound rettangolari, bisogna definire i

due punti estremi.– BoundingPolytope : crea bound poliedrici usando

l’intersezioni di quattro o più semispazi, bisogna elencare i piani dell’intersezione.

• Se opportunamente usati permettono di incrementare le performance, riducendo le operazioni svolte del motore di rendering

Page 15: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 15 di 29

Scope

• Lo Scope è una collezione di oggetti Group sui quali un nodo ha influenza.

• Bound e scope forniscono una funzionalità simile ma in modo diverso:– Un Bound definisce una regione spaziale.

– Uno Scope definisce dei raggruppamenti di oggetti

Page 16: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 16 di 29

Performance (compile)

• La rappresentazione di uno scene graph costruito da java non è molto efficiente.– La flessibilità nel realizzare universi virtuali viene

pagata in termini di prestazioni

• Per ovviare a ciò java3D utilizza internamente una rappresentazione più efficiente.– Invocando il metodo compile() del BranchGroup esso

viene convertito e ottimizzato in una rappresentazione interna.

• Conviene sempre compilare il BranchGroup prima di renderlo vivo (cioè di inserirlo in un Locale).

Page 17: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 17 di 29

Performance (capability)

• La conversione in una rappresentazione interna blocca il valore delle trasformazioni e di altri oggetti dello scene graph.– È necessario specificare prima cosa si vuole cambiare.

• Una caratteristica di un oggetto che può essere modificata è detta capability.– Impostando o azzerando una certa capability si decide

se una particolare caratteristica può essere modificata dopo che l’oggetto e diventato vivo.

Page 18: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 18 di 29

Interazioni

• In Java3D sia le animazioni che le interazioni sono definite utilizzando la classe Behavior:– Questa classe modifica lo scene graph in risposta ad

uno stimolo (tastiera, mouse, tempo, collisioni..)

– I cambiamenti prodotti possono essere l'aggiunta o rimozione di oggetti dallo scene graph oppure il cambiamento di attributi degli oggetti.

– Le possibilità sono limitate soltanto dalle capability degli oggetti stessi.

Page 19: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 19 di 29

Behavior

• Un behavior personalizzato deve implementare i metodi initialization e processStimulus della classe astratta Behavior.– initialization() : invocato quando lo scene graph

contenete il behavior diventa vivo. Deve inizializzare il trigger degli eventi.

– processStimulus() : invocato dal trigger quando si verifica la condizione specificata, occupandosi anche della decodifica dell’evento. Deve resettare il trigger.

Page 20: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 20 di 29

Wake up

• I behavior vengono attivati non appena si verificano gli stimoli a cui devono rispondere.

• Gli oggetti per definire gli stimoli sono le condizzioni di wake up che vengono definite nelle classi WakeupCondition.

• WakeupCondition– WakeupOr– WakeupAnd– WakeupAndOfOrs– WakeupOrOfAnds– WakeupCriterion

}Per la composizione di condizioni multiple.

Page 21: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 21 di 29

WakeupCriterion

• WakeupOnActivation• WakeupOnDeactivation• WakeupOnAWTEvent• WakeupOnBehaviorPost• WakeupOnCollisionEntry• WakeupOnCollisionExit• WakeupOnCollisionMovement• WakeupOnElapsedFrames• WakeupOnElapsedTime• WakeupOnSensorEntry• WakeupOnSensorExit• WakeupOnTransformChange• WakeupOnViewPlatformEntry• WakeupOnViewPlatformExit

Page 22: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 22 di 29

Navigare

• Il view branch graph di un universo virtuale contiene una view platform.

• Se tale trasformazione cambia, l’effetto è quello di muovere e orientare l’osservatore.

• Quindi, per navigare, è sufficiente aggiungere un behavior che cambia la view platform in risposta agli eventi

Page 23: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 23 di 29

Picking

• Il picking permette all’utente di interagire con i singoli oggetti della scena e viene implementato con un behavior che risponde agli eventi del mouse.

• Per recuperare l’oggetto selezionato, un raggio viene proiettato dal mouse verso il mondo virtuale.

• Viene calcolata l’intersezione del raggio con gli oggetti e si seleziona l’oggetto più vicino all’image plate.

Page 24: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 24 di 29

Picking

• Il test di intersezione è costoso, e tale costo cresce con la scena.– È possibile selezionare inizialmente gli oggetti “acchiappabili”, gli altri

non verranno considerati nel calcolo.

• Per ridurre il costo del calcolo è possibile limitare lo scope del test.– Nell’indicare il nodo radice del test invece di indicare la root dello scene

graph si specifica la radice del sottografo degli oggetti “acchiappabili”.

object

pick ray

image plate

mouse pointer

Page 25: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 25 di 29

Animazioni

• Come l’interazione anche l’animazione è implementata tramite behavior

• Inoltre esiste un particolare tipo di classi per l’animazione, dette interpolatori.– Un oggetto Interpolator manipola alcuni parametri dello scene

graph per crea animazioni basate sul tempo.

– Queste classi sono basate sui behavior.

– Usano un oggetto Alpha.• È un particolare oggetto che produce un valore tra zero e uno con il

variare del tempo. Produce un fronte d’onda.

Page 26: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 26 di 29

Luci

• Il modello d’illuminazione gestisce tre tipi di luce:– Ambientale : luce costante e molto leggera

– Diffusa : riflessione su un oggetto opaco

– Speculare : riflessione su un oggetto speculare

• Purtroppo alcuni fenomeni non vengono modellati:– Inter-riflessioni

– Ombre

• Java3D non limita il numero di luci utilizzabili contemporaneamente, tuttavia potrebbe essere la scheda video o la libreria basso livello a farlo (OpenGl limita ad 8).

Page 27: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 27 di 29

Classi Light

• L’Api Java3D fornisce 4 classi di per le luci:– AmbientLight : stessa intensità in tutte le posizioni.

– DirectionalLigth : raggi paralleli con intensità costante.

– PointLight : sorgente in un punto, intensità variabile.

– SpotLight: sottoclasse di PointLight, luce lungo una direzione all’interno di un angolo con intensità variabile.

• Lo stato della luce è un valore booleano per indicare se è accesa o spenta.

Page 28: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 28 di 29

Colori

• Ci sono tre modi per specificare il colore di un oggetto:– Metodo setColor() di Geometry.– Attributo ColoringAttributes.– Classe Material

• Specifica colori(ambientale, diffuso, speculare ed emissivo) e la lucentezza di un oggetto.

• Se viene usato più di un metodo:– Material viene usato in presenza di luce,

ColoringAttributes in assenza di luce.– Il colore di Geometry sovrascrive gli altri.

Page 29: Java 3D. Elementi di grafica digitale - Java 3D - Gobbo Dario2 di 29 Cosè Java 3D Java 3D è un API grafica 3d ad alto livello. –Il programmatore lavora.

Elementi di grafica digitale - Java 3D - Gobbo Dario 29 di 29

Normali

• Per concludere è necessario sottolineare che per illuminare un oggetto è necessario che esso stesso abbia definito le sue normali alle superfici.

• Quando si creano oggetti e possibile specificare le normali usando il metodo setNormal() della Geometry.– Usando un oggetto GeometryInfo è possibile

utilizzare la classe NormalGenerator per ottenere in automatico le normali.