Java 3D – Java 3D è una estensione standard di Java 2 jdk (development kit) E’ costituita da una gerarchia di classi utili nella creazione di universi virtuali Fornisce classi per Creazione di immagini Visualizzazione ed animazione Applicazioni di grafica interattiva 3D Introduction to Java3D 1 Java 3D Un programma Java3D crea istanze di oggetti Java3D e li posiziona in uno scene graph Lo scene graph è una struttura dati di oggetti 3D che specifica: il contenuto di un universo virtuale come tale contenuto deve essere renderizzato I programmi Java3D possono essere scritti sia come applicazioni sia come applet Introduction to Java3D 2 Notazione Visual object – si intende un oggetto nello scene graph (cubo, sfera..) Object – istanza di una classe Content – oggetti visuali in uno scene graph nel loro insieme, cioè contenuto visuale di una immagine Introduction to Java3D 3 Java 3d - API Un programma Java 3d è costruito da oggetti – istante di classi di Java 3D La libreria Java 3D API è definita da oltre 100 classi presenti nel package javax.media.j3d Queste classi sono dette il core di Java3D Ogni classe contiene moltissimi campi e metodi Generalmente per creare un semplice universo virtuale può essere creato con poche classi Introduction to Java3D 4 I package aggiuntivi Oltre al core sono presenti altri package come: Il package com.sun.j3d.utils comunemente chiamato le classi utility di Java3D Il core contiene solo le classi di livello più basso Le classi utility sono “utili” aggiunte al core Introduction to Java3D 5 Classi di utility Le classi di utility si dividono in quattro categorie: caricatori di contenuti classi di aiuto alla costruzione di scene graph classi geometriche classi di utility varie Nuove funzionalità (ad esempio le NURBs) potranno essere aggiunte alle classi di utility non al core Alcune classi di utility potrebbero essere spostate nel core nelle versioni successive Introduction to Java3D 6 Classi di utility 2 L'utilizzo delle classi di utility riduce molto le linee di codice di un programma Java3D In aggiunta al core ed alle utility un programma Java3D usa (quasi) sempre i package java.awt e javax.vecmath Il package javax.vecmath definisce le classi punto, vettore, matrice ed altri oggetti matematici Introduction to Java3D 7 General 3D Modelling Concepts Un universo virtuale Java3D è creato tramite uno scene graph - grafo della scena Uno scene graph è creato usando istanze di classi Java3D per definire: geometria suoni e luci posizioni e orientamenti Aspetti di oggetti visuali o audio La più comune relazione in uno SceneGraph è la relazione parent –child (come in VRML) Introduction to Java3D 8 Definizione di uno SceneGraph (1) SceneGraph è la struttura dati, utilizzata per memorizzare, organizzare e render l‘informazione di una scena (oggetti, materiali, luci...) Un grafo è una struttura dati composta da nodi ed archi: I nodi in uno scene graph sono oggetti Java3D Gli archi rappresentano due diversi tipi di relazione tra oggetti: Introduction to Java3D relazione parent –child relazione reference 9 Relazione Relazione parent-child Un nodo può avere più successori, ma un solo predecessore I nodi in relazione parent-child costituiscono lo scene graph tree Relazione reference Una reference associa un node component con uno scene graph node Introduction to Java3D 10 Definizione di uno SceneGraph (2) I nodi più importanti di uno scene graph sono: Virtual Universe, Locale, Groups, Leaf, NodeComponents Introduction to Java3D 11 Simboli di uno Scene Graph Nodes and Node Components (objects) Arcs (object relationships) VirtualUniverse Locale - root Group- scene graph tree Leaf - scene graph tree Parent-child link Reference Node Component Other objects Introduction to Java3D 12 Together a Locale and a Virtual Universe compose a SceneGraph superstructure. A reference associates a Node Component object with a Scene Graph Node . Introduction to Java3D 13 Scene Graph path Uno scene graph è costituito da alberi aventi radice nel nodo Locale Vi è un unico cammino dal nodo Locale ad un nodo Leaf Ogni Scene graph tree path specifica completamente lo stato della foglia cioè: Posizione Orientazione Dimensione Introduction to Java3D 14 Scene Graph path 2 Gli attributi visuali di ciascun oggetto visuale dipendono solo dal suo Scene Graph path Il sistema di rendering di Java 3D esegue il render delle foglie nell’ordine che ritiene più efficiente Introduction to Java3D 15 Gerarchia delle classi di Java 3D API Introduction to Java3D 16 Important Classes Virtual Universe and Locale Class SceneGraph Object Class è la classe base per ogni oggetto che appare in uno Java3D scene Graph. Questa classe astratta contiene oggetti node and node component Scene Graph Viewing Object Classes include 5 classi usate per gestire i parametri di viewing di uno scene graph (Canvas3D,Screen3D,View,PhysicalBody,PhysicalEnvironment) Simple Universe utility class usata per creare un programma Java3D senza trattare con le Viewing object Classes Introduction to Java3D 17 Classe Node Node è la superclasse astratta delle classi Group e Leaf Definisce importanti metodi comuni alle sue sottoclassi Le sottoclassi di Node costruiscono uno scene graph Introduction to Java3D 18 Scenegraph nodes Vi sono 2 tipi di nodi: - Group : il ruolo primario di un nodo Group è di essere parent di altri nodi- Group e Leaf - Leaf : i nodi leaf specificano shape, sound, and behavior di un visual object. Introduction to Java3D 19 Classe Group Group è la superclasse usata per specificare posizioni ed orientamenti degli oggetti nell'universo virtuale Sottoclassi della classe Group sono BranchGroup TransformGroup …… Nella rappresentazione grafica dello scene graph,i simboli di Group (cerchi) sono indicati con BG per BranchGroup e TG per TransformGroup Introduction to Java3D 20 Group nodes subclasses BranchGroup OrderedGroup Group SharedGroup Switch TransformGroup Primitive Introduction to Java3D 21 Classe Leaf Leaf è la superclasse usata per specificare: Alcune sottoclassi sono: forme e aspetti suoni comportamenti Shape3D, Light, Behavior e Sound Un nodo Leaf non può avere successori, ma reference ad oggetti NodeComponent Introduction to Java3D 22 Leaf nodes Subclasses Background Behavior Bounding Leaf Clip Leaf Fog Light Link Morph Shape3D Sound Soundscape Introduction to Java3D Viewplatfom 23 Node Component La classe Node Component class è usata per specificare una varietà di proprietà di un nodo Shape3D, quali Geometria Texture Trasparenza Colore Alcune classi sono Appeareance Coloring Attributes DepthComponent Geometry ImageComponent.... Un NodeComponent può essere collegato a più di un nodo Shape3D Introduction to Java3D 24 Esempio Un oggetto Virtual Universe è collegato a uno o più oggetti Locale. All‘oggetto locale sono associati 2 BranchGroup ContentBranch descrive il contenuto della scena ViewBranch descrive osservatore, piano immagine.. ContentBranch graph Introduction to Java3D ViewBranch graph 25 Java3D API The API has core classes and utility classes Core Classes javax.media.j3d package lowest level classes required for Java3D programming Introduction to Java3D Utility Classes com.sun.j3d.utils package convenient and powerful additions to the core 26 Passi per scrivere un programma Creare gli oggetti Canvas3D e VirtualUniverse Creare un oggetto Locale e collegarlo al VirtualUniverse Costruire un view branch graph Creare gli oggetti View, ViewPlatform, PhysicalBody e PhysicalEnvironment Collegare ViewPlatform, PhysicalBody, PhysicalEnvironment e Canvas3D alla View Costruire uno o più content branch graph Compilare tutti i branch graph Collegare tutti i branch graph al Locale Introduction to Java3D 27 Simple recipe for writing a Java3D program Using the SimpleUniverse class in Java 3D program reduces the time and effort needed to create the view branch Graph. The basic outline of Java 3D program development consists of seven steps : 1- Create a Canvas3D object 2- Create a VirtualUniverse object 3- Create a Locale object, attaching it to the VirtualUniverse object . 4- Construct a View object 5- Construct content branch graph 6- Compile branch graph 7- Insert subgraphs into the Locale. The steps 1,2,3,4,and 7 create a Simple Universe( code for creating a SimpleUniverse: SimpleUniverse ( ) ) Introduction to Java3D 28 HelloJava3D Class public class HelloJava3Da extends Applet { public HelloJava3Da() { setLayout(new BorderLayout()); 1- Create a canvas3D GraphicsConfiguration config = SimpleUniverse .getPreferredConfiguraton( ); Canvas3D canvas3D = new Canvas3D (config) ; 4- Compile ContentBranch add("Center“, canvas3D); Graph BranchGroup scene = createSceneGraph(); 2- Create a scene.compile(); Simpleuni // SimpleUniverse is a convenience Uility class verse SimpleUniverse SimpleU = new SimpleUniverse (canvas 3D) ; // This move the ViewPlatform back a bit so the 3- Customize // objects in the scene can be viewed . Simpleuniverse SimpleU.getViewingPatform().setNominalViewingTransform(); simpleU.addBranchGraph (scene); 5- Insert } // end of HelloJava 3Da (constuctor) Introduction to Java3D ContentBranchGraph into the Locale 29 SimpleUniverse SimpleUniverse è un oggetto che crea uno scene graph contenente un oggetto VirtualUniverse, un oggetto Locale ed un completo view branch graph Il view branch graph creato da un SimpleUniverse usa oggetti ViewingPlatform e Viewer al posto delle classi core utilizzate per creare il view branch graph Il package com.sun.j3d.utils.universe contiene le classi di utility SimpleUniverse ViewingPlatform Viewer Introduction to Java3D 30 SimpleUniverse Introduction to Java3D 31 SimpleUniverse constructors Introduction to Java3D 32 Passi per scrivere un programma Creare un oggetto Canvas3D Creare un oggetto SimpleUniverse e collegarlo all’oggetto Canvas3D Personalizzare l'oggetto SimpleUniverse Costruire uno o più content branch graph Compilare tutti i content branch graph Collegare tutti i content branch graph al Locale del SimpleUniverse Introduction to Java3D 33 Piano immagine Il SimpleUniverse crea un view branch graph completo contenente anche un image plate cioè la finestra 2D su cui l'universo virtuale viene proiettato e renderizzato Un oggetto Canvas3D può essere pensato come un image plate Il piano immagine è centrato nell'origine dell'universo con l’asse z uscente dallo schermo, l’asse x orizzontale con i valori positivi a destra l’asse y verticale con i valori positivi in alto Introduction to Java3D 34 Piano immagine Introduction to Java3D 35 HelloJava3D package it.unict.dmi.cg.HelloJava3D; import java.awt.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.*; import javax.media.j3d.*; import javax.swing.*; // Visualizza un cubo immobile public class HelloJava3D_a1 extends JFrame { public HelloJava3D_a1() { //Recupera le configurazioni grafiche del computer GraphicsConfiguration config=SimpleUniverse.getPreferredConfiguration(); //Crea un oggetto Canvas3D e lo aggiunge al frame Canvas3D canvas3D=new Canvas3D(config); this.getContentPane().add(canvas3D,BorderLayout.CENTER); Introduction to Java3D 36 HelloJava3D //Crea la scena BranchGroup scene=createSceneGraph(); //Crea il SimpleUniverse SimpleUniverse simpleU=new SimpleUniverse(canvas3D); //Questo comando serve per spostare leggermente indietro il sistema di riferimento // il metodo setNominalViewingTransform posiziona il punto di vista in (0,0,2.41) simpleU.getViewingPlatform().setNominalViewingTransform(); //Compila la scena (subito prima di renderla viva) scene.compile(); //Aggiunge la scena all'universo simpleU.addBranchGraph(scene); } Introduction to Java3D 37 HelloJava3D //Crea la scena private BranchGroup createSceneGraph() { //Crea la radice del branch graph BranchGroup objRoot=new BranchGroup(); //Aggiunge alla radice un cubo colorato objRoot.addChild(new ColorCube(0.4)); return objRoot; } public static void main(String[] args) { HelloJava3D_a1 hello=new HelloJava3D_a1(); hello.setTitle("Hello Java3D!"); hello.setSize(300,300); hello.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); hello.show(); } } Introduction to Java3D 38 Terminologia „Become live“ : Un Branch Graph diventa live appena è collegato ad un oggetto Locale. Ciascun oggetto di un Branch Graph live è soggetto ad essere renderizzato Compiling La compilazione di un BranchGroup converte un oggetto ed i suoi successori in una forma più efficiente per il rendering Introduction to Java3D 39 Performance La rappresentazione di uno scene graph costruito da Java3D non è molto efficiente La flessibilità nel realizzare universi virtuali offerta dallo scene graph viene pagata in termini di prestazioni Per tale motivo Java3D utilizzata internamente una rappresentazione più efficiente per migliorare le prestazioni di rendering Introduction to Java3D 40 Invocando il metodo compile() per un oggetto BranchGroup, si ottiene che tale oggetto sia convertito in una rappresentazione interna più efficiente Performance Introduction to Java3D 41 Capability La conversione in una rappresentazione interna ha degli “effetti collaterali” Un effetto è quello di bloccare i valori delle trasformazioni affini ed altri oggetti dello scene graph Se non specificato prima, il programma non avrà più modo (capability) di cambiare i valori di tali oggetti Introduction to Java3D 42 Capability Ci sono casi in cui un programma ha la necessità di cambiare tali valori anche dopo che gli oggetti siano diventati vivi Per esempio, è possibile creare animazioni cambiando i valori di un TransformGroup L’oggetto TransformGroup deve essere in grado di cambiare anche dopo essere diventato vivo Introduction to Java3D 43 Capability Capability: caratterista di un oggetto che può essere modificata Un oggetto può avere un insieme di capability Impostando o azzerando una capability si decide se una particolare caratteristica può essere modificata dopo che l'oggetto è diventato vivo Introduction to Java3D 44 Trasformazioni in Java3D La classe TransformGroup Class è necessaria per rappresentare la trasformazione di un oggetto Transfom3D Operazioni base: - Traslazione : muovere un oggetto da una posizione ad un‘altra - Rotazione : un oggetto può essere ruotato attorno ad una combinazione di assi X,Y,Z contemporaneamente - Scaling: un oggetto può variare la sua dimensione Introduction to Java3D 45 Key Java3D features Java 3D scene graphs sono considerevolmente più difficili degli scene graph di VRML, per la complessità di un linguaggio di programmazione come Java Ma Java3D sceneGraph offre eccellenti caratteristiche quali: - Rendering control - Scalable Performance - Behaviors - Generic Input Devices - Geometry Compresion - Versatile View Model - Camera-based View Model Introduction to Java3D 46 References Getting starting with Java3D API (Dennis J Bouvier) „ The Java3D Tutorial of Sun“ Java website http://java.sun.com/products/javamedia/3D http://www.sun.com/desktop/java3d http://java.sun.com/javase/technologies/desktop/ http://wiki.java.net/bin/view/Javadesktop/Java3D Introduction to Java3D 47