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
Package Il core Utility Altre classi utili 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
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
Un esempio di “Scene Graph” Universo Virtuale Locale Nodi BranchGroups Nodi TrasformGroups BG BG TG TG TG S S View Canvas3D Screen3D View Platform Geometry Apparance Geometry NodeComponent Physical Body Physical Enivironment Elementi di grafica digitale - Java 3D - Gobbo Dario
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
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
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
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. Elementi di grafica digitale - Java 3D - Gobbo Dario
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
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
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 S S Geometry Geometry Apparance Apparance Geometry ColoringAttributes Material LineAttributes Elementi di grafica digitale - Java 3D - Gobbo Dario
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
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
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
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
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
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
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
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
WakeupCriterion WakeupOnActivation WakeupOnDeactivation WakeupOnAWTEvent WakeupOnBehaviorPost WakeupOnCollisionEntry WakeupOnCollisionExit WakeupOnCollisionMovement WakeupOnElapsedFrames WakeupOnElapsedTime WakeupOnSensorEntry WakeupOnSensorExit WakeupOnTransformChange WakeupOnViewPlatformEntry WakeupOnViewPlatformExit Elementi di grafica digitale - Java 3D - Gobbo Dario
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
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
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
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. Elementi di grafica digitale - Java 3D - Gobbo Dario
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
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
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. Elementi di grafica digitale - Java 3D - Gobbo Dario
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