Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape...

84
Introduction to Java3D 1 Java 3D Classi delle primitive geometriche Come definire oggetti visuali Come specificare l'aspetto di un oggetto

Transcript of Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape...

Page 1: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 1

Java 3DClassi delle primitive geometricheCome definire oggetti visualiCome specificare l'aspetto di un oggetto

Page 2: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 2

Sistema di coordinateUna istanza della classe VirtualUniverse serve come radice dello scene graphIl termine virtual universe si riferisce ad uno spazio virtuale tridimensionale popolato di oggetti 3DCiascun oggetto Local stabilisce un sistema di coordinate cartesiane nel mondo virtualeUn oggetto SimpleUniverse crea uno scene graphcontenente un oggetto VirtualUniverse, un oggetto Locale ed un completo view branch graph : definisce un sistema di coordinate nel mondo virtuale

Page 3: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 3

ColorCubeGli esempi HelloJava3D usano la classe ColorCube

La classe ColorCube estende la classe Shape3D: èun Leaf node

Il costruttore ColorCube() costruisce un cubo standard, centrato nell’origine e di lato 2 (metri)Il costruttore Color Cube(double scale) costruisce un cubo di lato ridimensionato del fattore scale

Un oggetto ColorCube è un oggetto visuale, costituito da un cubo avente un colore differente su ciascuna faccia

Page 4: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 4

Classi delle primitive geometricheEsistono tre modi per definire la geometria di un oggetto visuale:

usare le classi di utility per box, coni, cilindri e sferespecificare le coordinate dei vertici per punti, linee e superficiusare le classi loader di geometrie

Page 5: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 5

Classe Shape3DUn nodo Shape3D definisce un oggetto visualeE' una sottoclasse di Leaf, quindi un oggetto Shape3D può essere solo una foglia in uno scene graphNon contiene informazioni su forma o colore di un oggettoTali informazioni sono negli oggetti NodeComponentcollegati al nodo Shape3D

Un nodo Shape3D può riferirsi ad un componente Geometry ed ad un componente Appearance

Page 6: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 6

Shape3D

Page 7: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 7

Shape3D

CostruttoriShape3D()

Costruisce ed inizializza un oggetto visuale senza componenti geometry e appearance

Shape3D( Geometry geometry)Costruisce ed inizializza un oggetto visuale con una

specificata geometriaShape3D( Geometry geometry, Appearanceappearance)

Costruisce ed inizializza un oggetto visuale con una specificata geometria ed apparenza

Page 8: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 8

Shape3D

Finché un oggetto Shape3D non è live e non è stato compilato, possono essere cambiati i riferimenti ad i suoi componenti -Geometry ed Appearance

Se il nodo Shape3D è vivo o compilato i suoi riferimenti posso essere cambiati solo se sono state impostate le rispettive capability

Page 9: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 9

CapabilityEsempi di capability per un nodo Shape3D sono:

ALLOW_GEOMETRY_READALLOW_GEOMETRY_WRITEALLOW_APPEARANCE_READALLOW_APPEARANCE_WRITEALLOW_COLLISION_BOUNDS_READALLOW_COLLISION_BOUNDS_WRITE

Page 10: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 10

Definire un oggetto visualeSe un particolare oggetto visuale deve apparire più volte in un universo virtuale conviene introdurre una classe per poterlo creare più volte con facilità

Vediamo un esempio per progettare una classe di un oggetto visuale

Page 11: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 11

Definire un oggetto visualepublic class VisualObject extends Shape3D{private Geometry voGeometry;private Appearance voAppearance;// crea un nodo Shape3D con una geometria ed una apparenzapublic VisualObject(){voGeometry = createGeometry(); // la geometria è creata con il metodo createGeometryvoAppearance = createAppearance(); // l’apparenza è creta con il nodo Appearancethis.setGeometry(voGeometry);this.setAppearance(voAppearance);}private Geometry createGeometry(){// codice per creare la geometria dell'oggetto}private Appearance createAppearance (){// codice per creare l'aspetto dell'oggetto}}

Page 12: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 12

Definire un oggetto visualeSi può creare un nuovo oggetto visuale estendendo la classe Shape3D Un oggetto visuale può essere utilizzato esattamente come è stato utilizzato un oggetto di classe ColorCubeUna volta creato un oggetto visuale può essere inserito in qualsiasi gruppo dello scene graph esattamente come il ColorCube

Page 13: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 13

SceneGraph –esempioHelloJava3Da

Page 14: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 14

Metodo createSceneGraph per la classe HelloJava3Da

1. public BranchGroup createSceneGraph() {2. // Create the root of the branch graph3. BranchGroup objRoot = new BranchGroup();4. // Create a simple shape leaf node, add it to the

scene graph.5. // ColorCube is a Convenience Utility class6. objRoot.addChild(new ColorCube(0.4));7. return objRoot;8. } // end of createSceneGraph method of

HelloJava3Da

Page 15: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 15

Definire un oggetto visualeUn altro modo per creare nuovi oggetti visuali è definire una classe contenitore non derivata dalle classi Java3DIn questo approccio l'oggetto visuale dovrà:

contenere un oggetto (root) Node o Shape3Ddefinire almeno un metodo che restituisce in riferimento all'oggetto root

Questa tecnica è leggermente più difficile, ma offre maggiore flessibilità

Page 16: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 16

Definire un oggetto visuale – classe primitive

Un ulteriore modo per creare oggetti visuali è quello di utilizzare le classi Box, Cone, Cylinder e Sphere definite nel package

com.sun.j3d.utils.geometryOgni classe estende la classe Primitiveche (a sua volta) estende Group

Page 17: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 17

Classi di utility per la geometria

Classi di utility per crearebox

conicilindri sfere

Page 18: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 18

Classe BoxCrea un “box” 3DLe dimensioni di default per lunghezza, larghezza ed altezza sono di 2 metri, con il centro posto nell'origineLa figura di default è un cubo con gli spigoli a ( -1, -1, -1) e ( 1, 1, 1)Le dimensioni xdim, ydim, zdim posso essere specificate all'atto della creazione

Box(float xdim, float ydim, float zdim, Appearanceappearance)

Page 19: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 19

Classe ConeDefinisce un cono “chiuso” centrato nell'origine con asse allineato lungo l'asse y

Il raggio e l'altezza di default sono 1.0 e 2.0Il centro del cono è il centro del suo “bounding box”Cone(float radius, float height, Appearance appearance)

Page 20: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 20

Classe CylinderCrea un cilindro “chiuso” centrato nell'origine con asse allineato lungo l'asse y

il raggio e l'altezza di default sono 1.0 e 2.0Cylinder(float radius, float height, Appearance appearance)

Page 21: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 21

Classe SphereCrea una sfera centrata nell'origine

il raggio di default è 1.0Sphere(float radius, Appearanceappearance)

Page 22: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 22

Esempio ConoYoyo

traslazionerotazione

Page 23: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 23

Esempio ConoYoyoIn default un cono è posizionato in modo da avere

il bounding box centrato nell’originel’orientazione dell’asse lungo l’asse y

L’oggetto yoyo è formato da 2 coni ruotati intorno l’asse z e traslati lungo l’asse xin modo da avere le 2 estremitànello stesso punto

Page 24: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 24

Class ConeYoyo//classe Yoyoclass ConeYoyo_a1{private BranchGroup yoyoBG;public ConeYoyo_a1(){ // crea un oggetto visuale con la geometria e l’apparenzayoyoBG=new BranchGroup();Appearance app=new Appearance();Transform3D translate=new Transform3D();Transform3D rotate=new Transform3D();//Crea il primo cono//Crea una traslazione per spostare il cono e poi una rotazione per

posizionare la punta del cono nell'origine

Page 25: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 25

Class ConeYoyotranslate.set(new Vector3f(0.1f,0.0f,0.0f));TransformGroup yoyoTGT1=new TransformGroup(translate);yoyoBG.addChild(yoyoTGT1);rotate.rotZ(Math.PI/2.0d);

TransformGroup yoyoTGR1=new TransformGroup(rotate);Cone cone1=new Cone(0.6f,0.2f);cone1.setAppearance(app);yoyoTGR1.addChild(cone1);yoyoTGT1.addChild(yoyoTGR1);//Crea la seconda meta' dello Yoyo//Il procedimento è speculare al precedentetranslate.set(new Vector3f(-0.1f,0.0f,0.0f));TransformGroup yoyoTGT2=new TransformGroup(translate);yoyoBG.addChild(yoyoTGT2);

Page 26: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 26

Class ConeYoyorotate.rotZ(-Math.PI/2.0d);TransformGroup yoyoTGR2=new TransformGroup(rotate);Cone cone2=new Cone(0.6f,0.2f);cone2.setAppearance(app);yoyoTGR2.addChild(cone2);yoyoTGT2.addChild(yoyoTGR2);//Compila l'oggettoyoyoBG.compile();

}public BranchGroup getBG(){ return yoyoBG;}}

Page 27: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 27

Classe ConeEsempi - esercitazione 4

ConeAppConeYoyoApp_1ConeYoyoApp_2

Page 28: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 28

Classi di utility per la geometria

Le classi di utility per le geometrie 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

La classe Primitive definisce molti valori comuni alle classi Box, Cone, Cylinder e Sphere

Ad esempio definisce il numero di poligoni utilizzati per rappresentare le superfici

Page 29: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 29

Classi matematiche-javax.vecmath

Per la creazione di oggetti visuali è necessario usare la classe Geometry od una sua sottoclasseLe sottoclassi della classe Geometry descrivono primitive basate sui vertici come punti, linee e poligoniPer poter studiare tali classi bisogna prima introdurre alcune classi matematiche:

Point*Color*Vector*TexCoord*

L’asterisco rappresenta variazioni del nome della classe

Page 30: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 30

Classi matematiche-javax.vecmath

Ogni vertice di un oggetto visuale può specificare fino a quattro oggetti matematici rappresentanti:

coordinate (Point*)colori (Color*)normali (Vector*)coordinate di texture (TexCoord*)

Page 31: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 31

PointGli oggetti (Point*) rappresentano le coordinate di un vertice – possono anche rappresentare la posizione di una immagine raster o di una sorgente luminosaLe coordinate sono necessarie per posizionare ogni vertice e non possono essere omesse; gli altri dati sono opzionaliAd esempio:

si può definire un colore (Color*) su ogni verticeper abilitare le risposte alle luci sono necessarie le normali (Vector*)per il texture mapping sono necessarie le coordinate di texture (TexCoord*)

Page 32: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 32

Classe PointGli oggetti Point* solitamente rappresentano le coordinate dei verticiPossono rappresentare anche:

la posizione di una sorgente di lucela posizione di una sorgente sonoraaltri dati posizionali

Page 33: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 33

Classe ColorUn oggetto Color* rappresenta un colore per un vertice, o per una proprietà del materiale, o per un oggetto visualeI colori posso essere specificati con Color3*o Color4*Con gli oggetti Color3* bisogna specificare

le componenti RGBCon gli oggetti Color4* bisogna specificare anche un valore di trasparenza

Page 34: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 34

Classe ColorConstants

1. import javax.vecmath.*;2. // crea le costanti di colore red, green,….3. class ColorConstants{4. public static final Color3f red = new Color3f(1.0f,0.0f,0.0f);5. public static final Color3f green = new Color3f(0.0f,1.0f,0.0f);6. public static final Color3f blue = new Color3f(0.0f,0.0f,1.0f);7. public static final Color3f yellow = new Color3f(1.0f,1.0f,0.0f);8. public static final Color3f cyan = new Color3f(0.0f,1.0f,1.0f);9. public static final Color3f magenta = new Color3f(1.0f,0.0f,1.0f);10. public static final Color3f white = new Color3f(1.0f,1.0f,1.0f);11. public static final Color3f black = new Color3f(0.0f,0.0f,0.0f);12. }

Page 35: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 35

Classe VectorGli oggetti Vector* sono utilizzati per rappresentare:

le normali superficiali nei verticila direzione di una sorgente di lucela direzione di una sorgente sonorauna traslazione di una trasformazione affine

Page 36: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 36

Classe TexCoordGli oggetti TexCoord* rappresentano le coordinate di una texture ad un verticeEsistono solo due classi TexCoord*

TexCoord2fTexCoord3f

TexCoord2f conserva le coordinate in una coppia (s, t)TexCoord3f conserva le coordinare in una tripla (s, t, r)

Page 37: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 37

Classe GeometryNella rappresentazione poligonale un oggetto visuale (da un semplice triangolo ad una automobile..) è modellato con dati “vertex-based”

In Java3D, ogni oggetto Shape3D dovrebbe chiamare il suo metodo setGeometry() per referenziare una o più istanze di Geometry

Geometry è una superclasse astratta e gli oggetti referenziati sono istanze di sue sottoclassi

Page 38: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 38

Classe GeometryLe sottoclassi di Geometry possono essere suddivise in tre categorie:

“non-indexed vertex-based” (ogni volta che un oggetto visuale è renderizzato, i suoi vertici sono utilizzati solo una volta)“indexed vertex-based” (ogni volta che un oggetto visuale è renderizzato, i suoi vertici possono essere usati più volte)altre classi ( Raster, Text3D e CompressedGeometry)

Page 39: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 39

Classe GeometryArrayLe 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

La classe GeometryArray conserva i suoi dati in array

Page 40: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 40

Classe GeometryArrayPer esempio, per specificare un triangolo un oggetto GeometryArray utilizza un array di tre elementi: uno per ogni vertice

Ogni elemento di questo array conserva le coordinate del suo vertice (che possono essere definite ad esempio con un oggetto Point*)

Possono essere definiti altri tre array per memorizzare

ColoreNormale superficialeCoordinate delle texture

Page 41: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 41

Ciclo di vita di un oggetto GeometryArrayIl ciclo di vita di un oggetto GeometryArray ècaratterizzato da tre passi:

costruzione di un oggetto vuotoimpostazione dei dati dell'oggettoreferenziamento dell'oggetto da uno (o più) oggetti Shape3D

Page 42: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 42

Ciclo di vita di un oggetto GeometryArrayCostruzione di un oggetto vuoto

Quando si costruisce un oggetto GeometryArray devono essere specificati due dati:

il numero di vertici – elementi dell’arrayil “vertex format” ovvero

il tipo di dati (coordinate, colore, normale e coordinate di texture) che devono essere memorizzati per ogni vertice

Page 43: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 43

Costruttore della classe geometryArray

Page 44: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 44

Ciclo di vita di un oggetto GeometryArrayImpostazione dei dati dell'oggetto

Dopo avere costruito l'oggetto bisogna assegnare i valori agli array come stabilito dal vertex format scelto

Questa operazione può essere fatta vertice per vertice oppure utilizzando un array per assegnare più valori con una sola chiamata

Page 45: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 45

GeometryArrayEsempi - esercitazione 4

AxisApp

Page 46: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 46

Sottoclassi di GeometryArrayLa figura mostra alcuni esempi delle sottoclassi PointArray, LineArray, TriangleArray, QuadArray

Notare che nessuno dei vertici è condiviso:Ogni linea o poligono è renderizzatoindipendentemente da ogni altro

Page 47: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 47

Sottoclassi di GeometryArrayLe sottoclassi di GeometryArray non permettono il riuso dei vertici

Il riuso permetterebbe anche migliori risultati di rendering e performance

Page 48: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 48

Sottoclassi di GeometryStripArray

La figura mostra alcuni esempi delle sottoclassi di GeometryStripArrayNotare il riutilizzo dei vertici

Page 49: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 49

Sottoclassi di GeometryStripArray

Il costruttore della classe GeometryStripArray ha tre parametri

numero di vertici “vertex format”“numero di vertici per strip”

L’ultimo parametro rappresenta il numero di vertici che ogni singolo strip contiene

Page 50: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 50

Sottoclassi di GeometryArrayEsempi - esercitazione 4

ConoYoyoApp_b1

Page 51: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 51

Sottoclassi di IndexedGeometryArray

Le sottoclassi di GeometryArray fanno un uso dispendioso dei verticiSolo le sottoclassi di GeometryStripArrayeffettuano un minimo riuso dei verticiPer esempio per definire un cubo sarebbero sufficienti solo 8 verticiEppure la GeometryArray ci costringere a specificare 24 vertici (con 16 vertici ridondanti)

Page 52: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 52

Sottoclassi di IndexedGeometryArrayLa classe IndexedGeometryArray introduce il concetto di indicizzazione dei verticiE' ancora necessario fornire gli array di informazioni vertex-based, ma è possibile:

memorizzare i vertici in un ordine qualsiasiriusarli a piacimento tutte le volte che servono indirizzandoli tramite un “index array”

Gli index array possono avere più riferimenti allo stesso vertice

Page 53: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 53

Sottoclassi di IndexedGeometryArrayI valori degli index array determinano l'ordine in cui i vertici vengono elaborati durante il renderingSvantaggi:

l'aggiunta di un ulteriore array che contiene gli indici dei verticiL'aumento del lavoro da svolgere dal processo di rendering e quindi un calo di prestazioni

Le geometrie indicizzate sono utili quando la velocità non è fondamentale

Page 54: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 54

Sottoclassi di IndexedGeometryArray

Page 55: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 55

Aspetto e attributiUn oggetto Shape3D può fare riferimento sia ad un oggetto Geometry sia ad un oggetto AppearanceL’ oggetto Geometry specifica le informazioni spaziali e (opzionale) di colore sui verticiTuttavia i dati della classe Geometry sono spesso insufficienti per descrivere l'aspetto di un oggetto: è necessario utilizzare un oggetto Appearance

Page 56: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 56

Aspetto e attributiUn oggetto Appearance non contiene le informazioni sull'aspetto di uno Shape3DPiuttosto sa dove trovare tali informazioni

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

Page 57: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 57

Aspetto e attributi

Page 58: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 58

Aspetto e AttributiGli oggetti a cui può referenziarsi un Appearance sono molteplici, i principali sono:

PointAttributes/LineAttributesPolygonAttributesColoringAttributes/TransparencyAttributesRenderingAttributes/MaterialTextureAttributes/Texture/TexCoordGeneration

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

Page 59: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 59

Condividere aspetti ed attributiE' possibile (e spesso utile) che piùoggetti facciano riferimento allo stesso oggetto AppearanceAnalogamente è possibile (ed utile) che più Appearance facciano riferimento agli stessi attributiLa condivisione può migliorare le performance

Page 60: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 60

Condividere aspetti ed attributi

Page 61: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 61

Attributi: PointAttributesL'oggetto PointAttributes gestisce come devono essere renderizzati i punti

In default se un vertice è renderizzato come un punto allora viene riempito un solo pixelE' possibile usare il metodo setPointSize() per rendere il punto più grande

In default punti più grandi hanno l'aspetto di un quadrato, a meno di non usare il metodo setPointAntialiasingEnable()

Page 62: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 62

Attributi: LineAttributesL'oggetto LineAttributes gestisce come devono essere renderizzate le lineeL'oggetto LineAttributes decide come

renderizzare le linee tramite tre parametriIn default un linea è tracciata continua, di spessore uno e senza antialiasing

Questi attributi possono essere modificati chiamando i metodi setLinePattern(),setLineWidth() e setLineAntialiasingEnable()

Page 63: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 63

Attributi: PolygonAttributesL'oggetto PolygonAttributes gestisce come devono essere renderizzati i poligoniL'oggetto PolygonAttributes decide come renderizzare i poligoni tramite due parametri:

come il poligono è rasterizzatose alcune sue parti non devono essere renderizzate

Page 64: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 64

Attributi: PolygonAttributesPer default un poligono è renderizzato pieno, ma il metodo setPolygonMode() può cambiare tale modalità (attivando la rappresentazione wireframe o solo dei vertici)Il metodo setCullFace() può essere usato per ridurre il numero di poligoni da renderizzareSe setCullFace() è impostato su CULL_FRONT o CULL_BACK allora in media la metà dei poligoni non sarà renderizzata

Page 65: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 65

Attributi: ColoringAttributesL'oggetto ColoringAttributes controlla come qualsiasi primitiva è colorataIl metodo setColor() imposta un colore che (in alcuni casi) specifica il colore della primitivaIl metodo setShadeModel() determina come interpolare i colori tra le varie primitive

Page 66: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 66

Attributi: ColoringAttributesPoiché i colori possono essere definiti anche su ogni vertice di un oggetto Geometry, ci potrebbe essere un conflitto con il colore definito da ColoringAttributes

In tali situazioni prevale il colore definito con GeometryAnalogamente se sono state attivate delle luci il ColoringAttributes viene ignorato

Page 67: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 67

Attributi: TrasparencyAttributes

L'oggetto TransparencyAttributes gestisce la trasparenza di qualsiasi primitivaIl metodo setTransparency() definisce il valore di trasparenza (0.0 opaco, 1.0 trasparente)Il metodo setTransparencyMode() abilita la trasparenza ed imposta la tecnica di trasparenza usata (SCREEN_DOOR, BLENDED e NONE)

Page 68: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 68

Attributi: TrasparencyAttributes

La tecnica SCREEN_DOOR seleziona (in modo random) alcuni pixel e li rende totalmente opachi, il resto dei pixel è reso totalmente trasparente; la percentuale di pixel trasparenti èuguale al valore di trasparenza impostatoLa tecnica BLENDED imposta la trasparenza di ogni pixel al valore di trasparenza impostato

Lo SCREEN_DOOR è più veloce del BLENDED, ma (ovviamente) al costo di una minore qualità del rendering

Page 69: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 69

Attributi: RenderingAttributesL'oggetto RenderingAttributes controlla molte operazioni di rendering:

effettua il “depth buffer test”effettua l'“alpha test”controlla se ignorare o meno i colori dei vertici della Geometrycontrolla se rendere invisibile un oggetto

Solitamente non è necessario modificare i valori di default di questo oggetto, quindi non ce ne occuperemo in dettaglio

Page 70: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 70

Attributi: valori di default

Page 71: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 71

Attributi: valori di default

Page 72: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 72

AttributiEsempi – esercitazione 5

TwistStripApp

Page 73: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 73

Bound e scopeUn bound definisce uno spazio (o regione) dove un nodo (una luce, un behavior, ecc.) agisceUn bound è definito usando le classi

BoundingSphere – sferaBoundingBox – parallelepipedo BoundingPolytope – poliedro

Ad esempio una sorgente di luce deve definire una regione di influenza ed un oggetto sarà illuminato solo se interseca tale regione

Page 74: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 74

Bound e scopeLo “scope” è una collezione di oggetti Group(BranchGroup, TransformGroup, ecc.) sui quali un certo nodo fa sentire la sua influenzaBound e scope forniscono una funzionalitàsimile, ma in modo diverso:

un bound specifica regioni spazialiuno scope specifica raggruppamenti di oggetti

Bound e scope sono usati da molti oggetti: luci, behavior, suoni, ecc.

Page 75: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 75

BoundI Bound permettono al programmatore di modificare azioni, aspetto, suoni, ecc.Se opportunamente usati i boundpermettono anche di incrementare le performance, riducendo il lavoro svolto dal motore di renderingPer tale motivo i bound dovrebbero essere scelti piccoli e semplici

Page 76: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 76

BoundingBoxUn BoundingBox definisce un parallelepipedo, mediante due punti:

Il punto avente coordinate (x,y,z) minime della regioneIl punto avente coordinate (x,y,z) massime

I lati sono paralleli agli assi del sistema di riferimento. In tal modo

il calcolo delle intersezioni tra bound risulta piùsemplice

Il costruttore in default crea un cubo centrato nell’origine con lato 2

Page 77: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 77

BoundingSphereUn oggetto BoundingSphere definisce una “bounding region” – sfericaIl costruttore in default crea una sfera centrata nell'origine con raggio 1E' il bound che fornisce le migliori performance di rendering

Page 78: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 78

Bounding LeafUtilizzando un oggetto bound per specificare una bounding region, l'oggetto stesso si muoverà con l'oggetto che lo referenziaQuesto comportamento è il più comune, ma non l'unicoCi sono situazioni in cui sarebbe meglio che la bounding region si muova indipendentemente dagli oggetti che la usano

Page 79: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 79

Bounding LeafPer esempio consideriamo una luce fissa che illumina oggetti in movimento: la regione di bounding della luce deve includere gli oggetti stessi

Una soluzione è di utilizzare una regione sufficientemente grande da includere tutti i punti dove gli oggetti si possono trovareUn’altra soluzione è usare un oggetto BoundingLeaf

Page 80: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 80

Bounding LeafUn BoundingLeaf è un oggetto inseribile all'interno di uno scene graph e referenziabile da chi ne ha bisogno

Essendo inserito nello scene graph esso si muove insieme ad altri oggetti ed indipendentemente dagli oggetti che lo referenziano

Nel nostro esempio la luce referenzierà un BoundingLeaf che però si muoverà insieme agli oggetti nella scena

Page 81: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 81

BoundingLeaf

Page 82: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 82

Aspetti AlternatiIn alcuni casi è necessario che l'aspetto di un oggetto cambi in funzione della posizione che l'oggetto stesso assume

Ad esempio nel film “La Maledizione della Prima Luna” il volto del pirata diventa scheletrico non appena entra nel raggio di luce della luna

La classe AlternateAppearance permette di ottenere questi effetti associando un Appearance ad una regione di influenza e/o ad uno scope

Page 83: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 83

Apetti alternatiEsempi –esercitazione 4

AlternateAppearanceAppAppearanceExplorer

Page 84: Java 3D - Dipartimento di Informaticaig/lezioni/13-Java3D-geometria.pdf · // Create a simple shape leaf node, add it to the scene graph. 5. // ColorCube is a Convenience Utility

Introduction to Java3D 84

ReferencesGetting starting with Java3D API (Dennis J Bouvier) „ The Java3D Tutorial of Sun“Java websitehttp://java.sun.com/products/javamedia/3Dhttp://www.sun.com/desktop/java3dhttp://java.sun.com/javase/technologies/desktop/

http://wiki.java.net/bin/view/Javadesktop/Java3D