introduzione a java3dig/lezioni/java3d.pdf · aveva la possibilità di “navigare” java3d...

90
Introduzione a Java3D Di Blasi Gianpiero - D.M.I. - Università di Catania

Upload: others

Post on 20-Oct-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

  • Introduzione a Java3D

    Di Blasi Gianpiero - D.M.I. - Università di Catania

  • L'evoluzione Hardware

    ● Le schede 3D producono oggi grafica interattiva paragonabile agli effetti speciali cinematografici

    ● Java è diventato uno standard di sviluppo

    ● Java3D è il punto di congiunzione dei due mondi

  • Addentriamoci in Java3D

    ● Java3D è una API grafica 3D di alto livello● Impiega lo Scene Graph Programming Model● Il programmatore decide solo “cosa” disegnare● Java3D deciderà “come” disegnare● Include le caratteristiche tipiche delle più

    popolari API grafiche (DirectX, OpenGL)

  • Cosa si può fare con Java3D? (1)

    ● Java3D permette di creare mondi virtuali con:– luci e texture– comportamenti ed animazioni– suoni

    ● Inoltre le applicazioni Java3D si adattano automaticamente al dispositivo di output:– un semplice monitor– occhialini 3D– CAVE (sistemi immersivi multi-schermo)

  • Cosa si può fare con Java3D? (2)

    ● Java3D supporta un ampio range di applicazioni:– sistemi CAD/CAM– visualizzazione scientifica/biomedicale– data visualization– simulazioni 3D– eCommerce– desktop 3D– videogame

    ● Vediamo qualche esempio concreto...

  • SDRC I-DEAS Viewer

    Webscope

  • VisAD spreadsheet

  • INT J/View3Dpro

  • ISS SMP Control Console x Canadarm2

  • Maestro

  • ASENZA Nokia Mobile Phone

    Xtivia Reality Server

  • Nearlife Virtual FishTank

  • Il CAVE alla University of Calgary

  • Looking Glass

  • Java3D - obiettivi di design

    ● Una collaborazione tra SUN, SGI, Intel e Apple

    ● I principali obiettivi di design sono stati:– integrazione con Java (core, portabilità)– alte prestazioni e scalabilità– supporto delle principali caratteristiche 3D (luce,

    shading, texture, ecc.)– forza industriale (non solo applet 3D o poco più)

  • Vediamo una demo

    Looking Glass

  • Lezione 1

    Hello Java3D

  • Costruzione di uno scene graph

    ● Un universo virtuale Java3D è creato tramite uno scene graph

  • Simboli di uno scene graph

    VirtualUniverse

    Locale

    Group

    Leaf

    NodeComponent

    Altri oggetti

    Relazione padre-figlio

    Reference

  • Un esempio più completo

  • SimpleUniverse

  • Alcune classi (1)

    ● Node– è una superclasse astratta delle classi Group e Leaf– definisce importanti metodi comuni alle sue sottoclassi– le sottoclassi di Node costruiscono uno scene graph

    ● Group– è la superclasse usata per specificare posizioni ed orientamenti

    degli oggetti nell'universo virtuale– le più comuni sottoclassi sono BranchGroup e TransformGroup– nello scene graph, i simboli di Group sono indicati con BG per

    BranchGroup e TG per TransformGroup

  • Alcune classi (2)

    ● Leaf– è la superclasse usata per specificare forme, aspetti,

    suoni e comportamenti– non possono avere figli, ma possono avere reference ad

    oggetti NodeComponent

    ● NodeComponent– è la superclasse usata per specificare geometrie,

    aspetto, texture e materiale di un nodo Shape3D– non sono parte dello scene graph, ma sono collegati ad

    esso tramite reference– può essere collegato a più di un nodo Shape3D

  • Un po' di terminologia (1)

    ● Prima di passare al codice bisogna spiegare due termini di Java3D: live e compiled– inserendo un branch graph in un Locale lo si rende

    vivo, insieme a tutti i sui figli– gli oggetti vivi possono essere renderizzati ed i loro

    parametri non possono essere più modificati– per rendere un parametro modificabile anche quando

    l'oggetto è vivo, la corrispondente capability deve essere impostata “modificabile” prima che l'oggetto diventi vivo

  • Un po' di terminologia (2)

    ● Un BranchGroup può essere compilato

    ● La compilazione di un BranchGroup converte l'oggetto e tutti i suoi figli in una forma più efficiente per il rendering

    ● Conviene sempre compilare un BranchGroupsubito prima di renderlo vivo e solo se deve essere inserito nel Locale

  • Un po' di terminologia (3)

  • Finalmente codice!

    Esempio

    HelloJava3D_b1HelloJava3D_c1

  • Lezione 2

    Forme ed aspetto

  • Le classi delle primitive geometriche

    ● Esistono tre modi per creare nuove geometrie:

    – usare le classi di utility per box, coni, cilindri e sfere

    – specificare le coordinate dei vertici per punti, linee e superfici

    – usare i loader di geometrie

  • La classe Shape3D

    ● Un nodo Shape3D definisce un oggetto visuale

    ● Non contiene informazioni su forma o aspetto di un oggetto

    ● Questo compito è delegato al componente Geometry ed al componente Appearance

  • Le classi di utility per le geometrie (1)

    ● Le classi di utility per creare box, coni, cilindri e sfere forniscono una grande flessibilità nella definizione di forme geometriche semplici e possono essere usate in molti casi pratici

    ● Tali classi non definiscono il colore o l'aspetto di un oggetto– tali informazioni derivano dal nodo Appearance – senza un riferimento ad un nodo Appearance l'oggetto

    potrebbe non essere visualizzato o essere visualizzato bianco

  • Le classi di utility per le geometrie (2)

    Esempio

    ConeYoyoApp_a2

  • La classe Geometry

    ● Geometry è una superclasse astratta per la gestione delle geometrie

  • La classe GeometryArray

    ● Le sottoclassi di Geometry posso essere usate per specificare punti, linee e poligoni pieni (triangoli e quadrilateri)

    ● Queste primitive “vertex-based” sono sottoclassi della classe GeometryArray

    ● Come dice il nome stesso la classe GeometryArrayconserva i suoi dati in degli array

  • Le sottoclassi di GeometryArray

    ● La figura mostra alcuni esempi delle sottoclassi di GeometryArray

    ● Notare che nessuno dei vertici è condiviso: ogni linea o poligono è renderizzato indipendentemente da ogni altro

  • Le sottoclassi di GeometryStripArray (1)

    ● La figura mostra alcuni esempi delle sottoclassi di GeometryStripArray

    ● Notare il diverso riutilizzo dei vertici che ogni classe mette in atto

  • Le sottoclassi di GeometryStripArray (2)

    Esempio

    ConeYoyoApp_b1

  • Aspetto ed attributi (1)

    ● Per descrivere l'aspetto di un oggetto è necessario utilizzare un oggetto Appearance

    ● Appearance non contiene le informazioni sull'aspetto di uno Shape3D, piuttosto sa dove trovare tali informazioni

    ● Un oggetto Appearance può referenziarsi a molteplici oggetti sottoclassi di NodeComponent(detti “attributi”), dove sono memorizzate le informazioni sull'aspetto dello Shape3D

  • Aspetto ed attributi (2)

  • Aspetto ed attributi (3)

    ● Gli oggetti a cui può referenziarsi un Appearancesono molteplici, i principali sono:– PointAttributes/LineAttributes– PolygonAttributes– ColoringAttributes/TransparencyAttributes– RenderingAttributes/Material– TextureAttributes/Texture/TexCoordGeneration

    ● Per ogni attributo esiste un metodo per impostare/recuperare il suo valore

  • La classe GeometryInfo (1)

    ● Creare mondi complessi “un triangolo alla volta” è terribilmente noioso

    ● Fortunatamente esistono una serie di metodo più facili per fare ciò

    ● La classe GeometryInfo è uno di questi metodi● Invece di dover definire una geometria un

    triangolo alla volta la classe GeometryInfopermette di definire poligoni arbitrari

    ● Sarà lei (ed altre classi collaboratrici) ad occuparsi di convertire la geometria in triangoli

  • La classe GeometryInfo (2)

  • La classe GeometryInfo (3)

    ● La classe GeometryInfo fa uso di tre classi collaboratrici

    – Triangulator: per la triangolazione dei poligoni

    – Stripifier: per il raggruppamento dei triangoli in strip (migliora le performance)

    – NormalGenerator: per la creazione delle superfici normali (per l'illuminazione)

  • La classe GeometryInfo (4)

    Esempio

    GeomInfoApp

  • Le classi Loader (1)

    ● Una classe Loader legge un modello da un file e ne crea la sua rappresentazione Java3D

    ● Il package com.sun.j3d.loaders fornisce gli strumenti per caricare contenuti 3D creati con altre applicazioni (3DStudio, Blender, ecc.)

    ● Poiché esistono moltissimi formati 3D (obj, vrml, 3ds, ecc.) e possono sempre esserne inventati di nuovi (per esempio X3D) Java3D mette a disposizione un'interfaccia generica per la creazione di caricatori di file

  • Le classi Loader (2)

    Esempio

    ObjLoad

  • Lezione 3

    Interazione ed Animazione

  • Creare mondi “vivi”

    ● Per rendere un mondo Java3D più interessante ed utile bisogna aggiungere interazione ed animazione

    ● Si ha interazione quando il mondo cambia in risposta ad un'azione dell'utente

    ● Si ha animazione quando il mondo cambia senza un intervento diretto dell'utente (e solitamente corrisponde con il passare del tempo)

    ● In Java3D sia le animazioni sia le interazioni sono definite utilizzando la classe Behavior

  • La classe Behavior

    ● Scopo di un Behavior è modificare uno scene graph in risposta a qualche stimolo– uno stimolo può essere la pressione di un tasto, un

    movimento del mouse, la collisione tra oggetti, il passare del tempo, ecc.

    ● I cambiamenti prodotti possono essere l'aggiunta e/o la rimozione di oggetti dallo scene graph, il cambiamento di attributi degli oggetti– le possibilità sono limitate soltanto dalle capability degli

    oggetti stessi

  • Implementazione di un Behavior (1)

    ● Un Behavior personalizzato deve implementare i metodi initialize() e processStimulus() della classe astratta Behavior– il metodo initialize() è invocato quando lo scene graph

    contenente il Behavior diventa vivo

    ● Esso è responsabile delle operazioni di inizializzazione del “trigger” degli eventi e dei valori iniziali del Behavior

    ● Il trigger è specificato come un WakeupConditiono una combinazione di WakeupCondition

  • Implementazione di un Behavior (2)

    ● Il metodo processStimulus() è invocato dal triggerquando si verifica la condizione specificata– processStimulus() è responsabile della risposta agli eventi

    ● Poiché molteplici eventi posso essere inglobati in un singolo WakeupCondition, questo metodo si occupa anche della decodifica dell'evento– ad esempio tutte le azioni da tastiera posso essere

    inglobate in un WakeupOnAWTEvent

    ● Solitamente questo metodo resetta anche il trigger

  • Le condizioni di wakeup (1)

    ● I Behavior vengono attivati non appena si verificano gli stimoli a cui devono rispondere

    ● Gli oggetti per definire gli stimoli sono le condizioni di wakeup definite nelle classi discendenti la classe WakeupCondition

    ● WakeupCondition è estesa da cinque classi:– una è la classe WakeupCriterion– le altre quattro permettono la composizione di

    condizioni di wakeup multiple

  • Le condizioni di wakeup (2)

  • Le condizioni di wakeup (3)

    Esempio

    SimpleBehaviorApp_a2

  • Le classi utility per la navigazione (1)

    ● Negli esempi finora esposti l'osservatore non aveva la possibilità di “navigare”

    ● Java3D permette ciò tramite delle classi di utility● Il view branch graph di un universo virtuale

    contiene una “view platform transform”● Se tale trasformazione cambia, l'effetto è quello

    di muovere e/o orientare l'osservatore● Aggiungere la possibilità di navigare è semplice:

    basta aggiungere un Behavior che cambia la viewplatform transform in risposta agli eventi

  • Le classi utility per la navigazione (2)

  • Le classi utility per la navigazione (3)

    Esempio

    KeyNavigatorApp

  • Le classi utility per il mouse (1)

    ● Il package com.sun.j3d.utils.behaviors.mouse contiene i behavior per l'interazione con il mouse

    ● L'interazione tramite mouse prevede:– traslazione (movimento su un piano parallelo all'image

    plate)– zooming (movimento in avanti ed indietro)– rotazione

  • Le classi utility per il mouse (2)

    Esempio

    MouseBehaviorApp

  • Le classi utility per il picking (1)

    ● Esistono due modi per usare il picking in Java3D:– usare le classi utility– creare una classe di picking personalizzata

    ● Il package del picking include le classi utility:– PickRotateBehavior– PickTranslateBehavior– PickZoomBehavior

    ● Ogni classe usa un bottone del mouse diverso così da renderne possibile l'uso simultaneo

  • Le classi utility per il picking (2)

    Esempio

    MousePickApp_a1

  • Le animazioni in Java3D (1)

    ● Come l'interazione anche l'animazione in Java3D è implementata tramite i Behavior

    ● Teoricamente è possibile creare qualsiasi animazione personalizzata usando i Behavior, inogni caso Java3D fornisce una serie di classi di utility per le animazioni più comuni

    ● Ovviamente queste classi sono basate sui Behavior

  • Le animazioni in Java3D (2)

    ● Gli interpolatori sono classi per le animazioni: un oggetto Interpolator manipola alcuni parametri di uno scene graph per creare animazioni basate sul tempo

    ● Un altro insieme di animazioni servono ad “animare” gli oggetti visuali in risposta ai cambiamenti del punto di osservazione

    ● Questo insieme include le classi Billboard,OrientedShape3D e LOD (Level of Detail)

    ● La classe Morph si occupa invece di “animare” le geometrie

  • Gli Interpolatori e la classe Alpha

    ● Gli Interpolator sono Behavior personalizzati che usano un oggetto Alpha

    ● Le azioni degli Interpolator comprendono il cambiamento di posizione, orientamento, dimensione, colore e trasparenza di un oggetto

    ● Esistono Interpolator anche per altre azioni, incluse le combinazioni delle precedenti azioni

  • La classe Alpha (1)

    ● Un oggetto Alpha produce un valore, detto valore alpha, compreso tra zero ed uno, estremi inclusi– il valore alpha cambia nel tempo in base ai parametri

    dell'oggetto stesso

    ● Fissati i parametri di Alpha ed un particolare istante di tempo, c'è un solo valore alpha che l'oggetto Alpha può produrre– disegnando il valore di alpha nel tempo si può vedere

    il “fronte d'onda” che l'oggetto Alpha produce

  • La classe Alpha (2)

  • Le classi Interpolator (1)

  • Le classi Interpolator (2)

    Esempio

    ClockApp_a2

  • Lezione 4

    Luci e texture

    Di Blasi Gianpiero - D.M.I. - Università di Catania

  • Le luci in Java3D (1)

    ● Molti degli esempi finora proposti davano la sensazione di “finto”

    ● Tale sensazione è principalmente data dall'assenza di luci– è arrivato il momento di illuminare il nostro mondo

    ● Java3D “illumina” gli oggetti in base ad una combinazione delle proprietà degli oggetti Material e delle luci nell'universo virtuale

  • Le luci in Java3D (2)

    Esempio

    SimpleLightApp_b1

  • Le classi Light

    ● L'API Java3D fornisce quattro classi per le luci, ogni classe deriva dalla classe astratta Light

    ● La classe Light fornisce i metodi e le capability per manipolare lo stato, il colore ed i Bound di una luce

    ● Lo stato di una luce è un booleano che “accende” e “spegne” la luce stessa

  • La classe AmbientLight

    ● Una AmbientLight fornisce una luce della stessa intensità in tutte le posizioni ed in tutte le direzioni (limitatamente al suo Bound)

    ● Una AmbientLight modella la luce riflessa dagli altri oggetti– se guardiamo sotto un tavolo vedremo la sua superficie

    inferiore anche se nessuna luce la illumina direttamente (a meno di avere una lampada sotto il tavolo)

    ● Una AmbientLight interagisce con il colore ambientale di un oggetto

  • La classe DirectionalLight

    ● Una DirectionalLight approssima sorgenti di luce molto distanti (ad esempio il sole)– diversamente dalla AmbientLight, una

    DirectionalLight illumina solo in una direzione

    ● Poiché tutti i vettori di luce di una DirectionalLight sono paralleli, la luce non si attenua mai (la luce solare non si attenua)

    ● In altre parole, l'intensità di una DirectionalLightnon varia al variare della distanza tra oggetto e DirectionalLight

  • La classe PointLight

    ● La PointLight è l'opposto della DirectionalLight

    ● Essa è una sorgente di luce puntuale che si diffonde in tutte le direzioni e la cui intensità diminuisce con la distanza (ad esempio una lampada)

    ● L'attenuazione di una PointLight è modellata da un'equazione quadratica concettualmente simile a quella della forza di gravità

  • La classe SpotLight (1)

    ● Una SpotLight– è una sottoclasse di PointLight– aggiunge il concetto di direzione e concentrazione ad

    una PointLight– modella sorgenti di luce fatte dall'uomo come luci flash

    e riflettori– “emana” una luce lungo una direzione ed all'interno di

    un angolo di visuale; all'interno di questo angolo l'intensità della luce varia in funzione dell'angolo e dalla distanza dal vertice

  • La classe SpotLight (2)

  • La classe Material

    ● Le proprietà “materiali” di un oggetto possono essere impostate tramite l'attributo Material– l'oggetto Material specifica i colori (ambientale,

    diffuso, speculare ed emissivo) e la lucentezza di un oggetto

    ● I primi tre colori sono usati nel modello di illuminazione per calcolare le riflessioni

    ● Il colore emissivo permette ad un oggetto di “emettere” luce propria

    ● La lucentezza serve per le riflessioni speculari

  • Impostare i colori di un oggetto (1)

    ● Ci sono tre modi per impostare i colori di un oggetto:– tramite il metodo setColor() di Geometry– tramite il ColoringAttributes– tramite il Material

    ● Java3D permette di creare oggetti usando nessuno, alcuni o tutti e tre i modi appena visti

  • Impostare i colori di un oggetto (2)

    Illuminazione abilitata

    Risultato

    No No Colore di MaterialSi No Colore di GeometryNo Si Colore di MaterialSi Si Colore di Geometry

    Illuminazione disabilitata

    Risultato

    No No BiancoSi No Colore di GeometryNo Si Colore di ColoringAttributesSi Si Colore di Geometry

    Colore di Geometry presente

    Colore di ColoringAttributes

    presente

    Colore di Geometry presente

    Colore di ColoringAttributes

    presente

  • Le normali alle superfici

    ● Per illuminare un oggetto è necessario che esso stesso abbia definito le sue normali alle superfici– quando si creano oggetti usando le Geometry bisogna

    usare uno dei metodi setNormal() per specificare le normali alle superfici

    ● Utilizzando un oggetto GeometryInfo è possibile utilizzare la classe NormalGenerator per ottenere in automatico le normali– le primitive geometriche generano in automatico le

    normali (se specificato nel costruttore)

  • Texturing – concetti base (1)

    ● In Java3D il texturing di poligoni è ottenuto:– creando un Appearance– caricando una texture– specificando le posizione della texture sulla geometria– impostando gli attributi di texturing

    ● A causa dell'estrema flessibilità del modello di texturing di Java3D, il numero di opzioni che l'API mette a disposizione potrebbe a prima vista confondere le idee

    ● In realtà il texturing non è particolarmente complesso

  • Texturing – concetti base (2)

    Esempio

    SimpleTextureApp_a2

  • Generazione automatica delle coordinate (1)

    ● Assegnare le coordinate delle texture per ogni vertice della geometria è un passo necessario e complicato

    ● Le coordinate delle texture sono spesso calcolate con codice specifico per ogni oggetto

    ● Sarebbe meglio avere un sistema automatico: questo è proprio quello che tenta di fare la classe TexCoordGeneration

  • Generazione automatica delle coordinate (2)

    ● Per generare automaticamente le coordinate delle texture bisogna specificare alcuni parametri in un oggetto TexCoordGeneration

    ● Le coordinate delle texture sono calcolate a runtime in base ai parametri specificati

    ● I parametri da specificare sono: formato delle texture (2D o 3D), modalità di generazione (lineare o sferica)

  • Generazione automatica delle coordinate (3)

    Esempio

    TexCoordGenApp

  • Cosa non abbiamo Fatto?

    ● Approfondimenti sui vari argomenti esposti● Collisioni● Dispositivi di input● Viste multiple● Suono

    E tanto altro ancora...

  • Riferimenti vari

    ● Documentazione Java3D

    ● Tutorial Java3D

    ● http://www.dmi.unict.it/~gdiblasi/didattica.html

    http://www.dmi.unict.it/~gdiblasi/didattica.html

  • LibriA.E. Walsh, D. GehringerJava3D API Jump-StartPrentice Hall PTR

    D. SelmanJava3D ProgrammingManning Publications Company

    H. Sowizral, K. Rushforth, M. DeeringThe Java 3D API SpecificationAddison-Wesley Professional

    K. Brown, D. PetersenReady-to-Run Java 3D, with plug-and-play codeJohn Wiley & Sons Inc

    J. Barrilleaux3D User Interfaces with Java 3DManning Publications Company

  • Introduzione a Java3D

    Di Blasi Gianpiero - D.M.I. - Università di Catania