Seminario per il corso “Elementi di Grafica Digitale” Dott. Federico ELIA A.A. 2008-2009 Set di API aggiuntive per JRE / JDK specifiche per la grafica 3D Circa 30 Package, alcuni già deprecated nella attuale versione 1.5.2 Disponibilità per le principali piattaforme Wrapper per OpenGL / Direct3D Sintassi 100% Java™ Documentazione in formato HTML Tutorial online sul sito di Sun Microsystems Potenzialità? Definizione di oggetti 2D, 3D in varie modalità Aggiunta di suoni alla scena Luci direzionali, ambientali, omnidirezionali, spot Gestione eventi tastiera/mouse/periodici Background, nebbia Rotazione, scala, rotazione Testurizzazione, materiale, trasparenza Visualizzazione: Canvas3D (Applet oppure finestra Swing/Awt) Valori floating point (float) Unità di misura: metro Struttura “ad albero” Nodo radice: VirtualUniverse Nodi gruppo: BranchGroup Nodi trasformazione: TransformGroup Nodi per la selezione fra due figli: Switch Foglie: Shape3D e derivati Ramificazione iniziale: Content Branch: Oggetti contenuti nella scena View Branch: Oggetti per la visualizzazione Un nodo inserito nell’albero diventa “vivo” La scena può esser “compilata” per migliorare le prestazioni Di default se si tenta di modificare un nodo già attached all’albero, viene generata un’eccezione RestrictedAccessException. È spesso necessario modificare l’aspetto od il comportamento dei nodi: alla creazione dell’oggetto occorre aggiungere le istruzioni che abilitino le operazioni sul nodo: nodo.setCapability(…); Metodo più veloce: Disegnare su carta l’albero Nella codifica, si creano i nodi e si associano al parent partendo dalle foglie, risalendo l’albero fino alla radice Metodo più versatile (necessario per le modifiche successive della scena): Dal disegno su carta dell’albero si codificano i nodi Si aggiungono le necessarie istruzioni setCapability(…); per ogni nodo e si può costruire l’albero secondo il criterio più conveniente Diagramma della scena: ColorCube OrientedShape3D Text2D / Text3D Box / Cone / Cylinder / Sphere CompressedGeometry / GeometryArray Raster LineStripArray / LineArray / PointArray TriangleArray / QuadArray … Appearance: ColoringAttributes: Definisce come disegnare le primitive dei poligoni (triangoli, quadrilateri…) Texture: Definisce spessore ed uso di antialiasing per i punti PolygonAttributes: Definisce spessore, pattern ed antialiasing per le linee PointAttributes: Definisce il colore ed il metodo di colorazione LineAttributes: Descrive completamente un oggetto shape Definisce l’immagine da applicare ad una shape e la modalità … A video viene mostrato solo il contenuto nel volume del Frustum, compreso fra il Front Clip Plane ed il Back Clip Plane Gli oggetti che intersecano i piani vengono tagliati È possibile personalizzare la posizione dei piani agendo sul View Branch dell’universo: void View.setBackClipDistance(double); void View.setFrontClipDistance(double); double View.getBackClipDistance(); double View.getFrontClipDistance(); AmbientalLight: DirectionalLight: Luce omogenea nel suo bound in tutte le direzioni Interagisce con l’AmbientColor del Material Sorgente di luce a raggi paralleli, senza attenuazione Interagisce con lo SpecularColor ed il DiffuseColor PointLight: Sorgente puntuale omnidirezionale (con attenuazione) Interagisce con lo SpecularColor ed il DiffuseColor SpotLight: Simile a PointLight, ma “a faretto”: fascio conico Interagisce con lo SpecularColor ed il DiffuseColor Basate su Matrici di trasformazione 4x4 (double) Manipolabili con gli oggetti di tipo Transform3D È possibile combinare più trasformazioni insieme Un oggetto shape, per esser trasformato, deve esser figlio di un oggetto TransformGroup associato ad un Transform3D I TransformGroup possono esser figli di altri TransformGroup, in tal caso gli shape subiscono tutte le trasformazioni, a partire da quella superiore Gli attributi di una forma cambiano nel tempo in base a: Interazione dell’utente Tempo Animazioni controllate con oggetti Behavior, normalmente associati a TransformGroup Behavior caratterizzati da: inizializzazione stimolo (il verificarsi di un evento) Behavior comuni per l’interazione con l’utente: KeyNavigationBehavior: Consente la navigazione utilizzando la tastiera MouseBehavior: Permette di traslare e ruotare PickMouseBehavior: Consente di selezionare col click del mouse l’oggetto su cui operare traslazione o rotazione OrbitBehavior: Rotazione, traslazione, zoom della scena con l’uso del mouse (click, drag&drop, scroll) … Behavior comuni basati sul tempo (Alpha): ColorInterpolator: Modifica uno dei colori (Speculare, Emissione, Diffuso e/o Ambiente) di un Material SwitchValueInterpolator: Cambia la visualizzazione dei nodi figlio di un oggetto Switch PositionInterpolator/RotationInterpolator/ ScaleInterpolator: Cambiano la posizione / angolo di rotazione / fattore di scala di un nodo TransparencyInterpolator: Varia la trasparenza del nodo target, interessandone i TransparencyAttributes dell’Appearance Oggetto di classe Alpha: Fornisce dei metodi per convertire un valore temporale in un valore Alpha, nel range [0,1] Parametri da configurare: numero di volte che si deve eseguire l’operazione tempo in ms fra il tempo di partenza ed il primo trigger ulteriore tempo in ms prima della partenza modalità di funzionamento incremento e/o decremento periodo in ms durante il quale l’oggetto Alpha va da 0 a 1 (/da 1 a 0) accelerazione costante dell’incremento / decremento il periodo in ms per il quale l’oggetto Alpha resta ad 1 (/0) Java è un linguaggio (semi?)interpretato Java3D poggia su librerie grafiche native e vi accede attraverso chiamate a DLL Il funzionamento del Garbage Collector non è prevedibile Non è possibile utilizzare direttamente alcune funzioni native degli adattatori grafici (Bump Mapping, ad esempio), è richiesto l’impiego di tempo CPU per sopperire a questa mancanza, a meno di usare ShaderProgram Non sempre le prestazioni sono accettabili… Documentazione “cristallina” Sintassi di facile comprensione ed apprendimento API aperta all’ estensione delle classi Moltissime primitive grafiche Utilità per la manipolazione di immagini Facile costruzione delle scene Perfettamente integrata con le classi base di Java Multipurpose: usato in C.A.D., giochi, ecommerce, simulazione, cinema, biomedicina, … Forse ideale per l’avvicinamento alla Computer Graphics Sun Microsystems - Java 3D™ API Specification F. Milanese - Introduzione a Java 3D G. Di Blasi – Java3D