Java 3D 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” Elementi di grafica digitale - Java 3D - Gobbo Dario 2 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 3 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 4 di 29 Un esempio di “Scene Graph” Universo Virtuale Locale BG TG TG S S BG Nodi BranchGroups TG Nodi TrasformGroups View Canvas3D Screen3D View Platform Geometry Apparance Geometry NodeComponent Elementi di grafica digitale - Java 3D - Gobbo Dario Physical Body Physical Enivironment 5 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 6 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 7 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 8 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 NodeComponent collegate allo Shade3D. Elementi di grafica digitale - Java 3D - Gobbo Dario oggetti 9 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 10 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 11 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. S Geometry ColoringAttributes S Apparance Material S Geometry Apparance Geometry LineAttributes Elementi di grafica digitale - Java 3D - Gobbo Dario 12 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 13 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 14 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 15 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). Elementi di grafica digitale - Java 3D - Gobbo Dario 16 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 17 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 18 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 19 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 20 di 29 WakeupCriterion • • • • • • • • • • • • • • WakeupOnActivation WakeupOnDeactivation WakeupOnAWTEvent WakeupOnBehaviorPost WakeupOnCollisionEntry WakeupOnCollisionExit WakeupOnCollisionMovement WakeupOnElapsedFrames WakeupOnElapsedTime WakeupOnSensorEntry WakeupOnSensorExit WakeupOnTransformChange WakeupOnViewPlatformEntry WakeupOnViewPlatformExit Elementi di grafica digitale - Java 3D - Gobbo Dario 21 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 Elementi di grafica digitale - Java 3D - Gobbo Dario 22 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 23 di 29 Picking mouse pointer pick ray object image plate • 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”. Elementi di grafica digitale - Java 3D - Gobbo Dario 24 di 29 Animazioni • Come l’interazione anche l’animazione è implementata tramite behavior • Inoltre esiste un particolare l’animazione, dette interpolatori. tipo di classi per – 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 25 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). Elementi di grafica digitale - Java 3D - Gobbo Dario 26 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 27 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 ColoringAttributes in assenza di luce. – Il colore di Geometry sovrascrive gli altri. Elementi di grafica digitale - Java 3D - Gobbo Dario di luce, 28 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. Elementi di grafica digitale - Java 3D - Gobbo Dario 29 di 29