Massimiliano Piscozzi – piscozzi@dico.unimi.it Sistemi multimediali Massimiliano Piscozzi – piscozzi@dico.unimi.it
Links utili Web 3D Consortium Viewers e plugin Specifiche ed esempi: www.web3d.org Viewers e plugin Windows Octagon Free Player: www.octaga.com BS Contact VRML 6.1: www.bitmanagement.de OpenWorlds: www.openworlds.com Flux v.1.1.: www.mediamachines.com Linux FreeWrl: freewrl.sourceforge.net Octagon Free player e Bs Contact VRML 6.1 consigliati Consigli su installazione (ActiveX)
Riassunto lezione precedente X3D/VRML files, streams Node A Node B Node C Node D Node E Node F Node G XML In file .X3D definiamo la scena virtuale attraverso una serie di istruzioni dichiarative; esse sono codificate in XML e permettono di creare gli oggetti nello scene graph e di organizzarli fra loro Abbiamo 3 nodi radice.... DAG Transformation hierarchy Connessioni tra campi (non distinguibili nello schema) Le connessioni fra campi settate in modo opportuno definiscono dei comportamenti nella scena virtuale Scene graph
Struttura del corso Introduzione a X3D Architettura interna di X3D Presentazione degli oggetti principali che compongono una scena X3D e corrispondente codifica in XML Creazione al computer di scene X3D Utilizzo del software X3D-Edit
Componenti, profili Componente Profilo Insieme di oggetti X3D e servizi che fornisce delle funzionalità fra loro collegate Ex: Rendering component, Sound component, Scripting component Specifica uno o più livelli qualità dei servizi Profilo Insieme di funzionalità e requisiti che devono essere supportati affinché un’implementazione sia conforme a tale profilo Ex: Core profile, Interactive profile, Full profile Definito come un insieme di componenti e di corrispondenti livelli Abbiamo finora parlato di oggetti.. Vediamo come sono organizzati fra loro (oggetti di vari tipi, ma alcuni hanno caratteristiche comuni).................. Profile: conforme ricordiamoci che X3D è uno standard che può essere implementato in modi diversi ciò permette implementazioni incrementali I profili vanno specificati anche nei nostri file X3D
Profili BaseVRML97 Interchange Interactive Extensible Full0x NURBS Text Extrusion Switch Sensor Spot light Script, PROTO Key Sensor Extensible Full0x
Struttura astratta di X3D Header (dipendente dalla codifica utilizzata): Identificazione dello standard supportato (“X3D”) Identificazione del sistema di codifica dei caratteri (“UTF-8”) Dichiarazione del profilo Dichiarazione dei componenti aggiuntivi (opzionale) Dichiarazione dei metadata (opzionale) Non modificano lo scene graph Specificano informazioni aggiuntive Dichiarazioni per la creazione e l’organizzazione dei nodi nello scene graph Mondo X3D concettualmente organizzato nel seguente modo Saranno le parti che identificheremo in un file X3D e che andremo a scrivere creando un nostro file X3D
Esempio di file X3D-XML Dichiarazione XML, codifica caratteri <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "http://www.web3d.org/x3d/content/x3d-3.0.dtd"> <X3D profile="Full"> <head> <meta name="filename" content="SimpleTest.x3d"/> <meta name="description" content="Simple X3D example"/> <meta name="created" content="25 aprile 2004"/> </head> <Scene> <Transform> <Shape> <Cylinder/> <Appearance> <Material diffuseColor="0.6 0.3 0.1"/> </Appearance> </Shape> </Transform> </Scene> </X3D> Dichiarazione XML, codifica caratteri File DTD necessario per la codifica XML Profilo Metadata Tag <Scene> che racchiude tutte le dichiarazioni necessarie a creare oggetti nello scene graph Non aspettatevi riga per riga quello che ho detto prima.... ANALISI XML!!!!
XML Linguaggio di marcatura (mark-up language) aperto e basato su testo Fornisce informazioni di tipo strutturale e semantico relative ai dati veri e propri <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Rubrica SYSTEM "C:/rubrica.dtd"> <Rubrica> <Persona> <Nome> Marco </Nome> <Telefono> 339-1111111 </Telefono> <Email> marco@provider.it </Email> </Persona> <Nome> Chiara </Nome> <Telefono> 339-2222222 </Telefono> <Email/> </Rubrica> E’ un metalinguaggio che permette di creare dei linuaggi di markup personalizzati DTD: insieme di regole che stabiliscono rigorosamente la struttura di un tipo di documento
XML: tipi di documento <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "http://www.web3d.org/x3d/content/x3d-3.0.dtd"> <X3D profile="Full"> <head> <meta name="filename" content="SimpleTest.x3d"/> <meta name="description" content="Simple X3D example"/> <meta name="created" content="25 aprile 2004"/> </head> <Scene> <Transform> <Shape> <Cylinder/> <Appearance> <Material diffuseColor="0.6 0.3 0.1"/> </Appearance> </Shape> </Transform> </Scene> </X3D> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Rubrica SYSTEM "C:/rubrica.dtd"> <Rubrica> <Persona> <Nome> Marco </Nome> <Telefono> 339-1111111 </Telefono> <Email> marco@provider.it </Email> </Persona> <Nome> Chiara </Nome> <Telefono> 339-2222222 </Telefono> <Email/> </Rubrica>
XML: sintassi (1) Tutti i tag devono essere racchiusi in un tag radice Tutti i tag devono chiudersi Tag di apertura e chiusura: <tag>...</tag> Tag vuoto: <tag/> I tag sono case sensitive <myTag> e <MYTAG> non sono equivalenti I valori degli attributi devono essere racchiusi da virgolette <myTag height=“5” description=“BlaBlaBla”> I tag devono essere corretamente innestati fra loro Corretto: <firstTag><secondTag>...</secondTag></firstTag> Non corretto: <firstTag><secondTag>...</firstTag></secondTag>
XML: sintassi (2) Caratteri speciali & & < < > &rt; ‘ ' “ " Commenti compresi fra i tag <!-- e --> <!-- Questo è un commento --> CDATA compresi fra i tag <![CDATA[ e ]]> <![CDATA[ Testo non analizzato dal parser “XML” ]]>
Nodi principali <Transform> <Shape> <Cylinder/> <Appearance> <Material diffuseColor="1.0 0.4 0.0"/> </Appearance> </Shape> </Transform> Transform: crea un sistema di coordinate locale per operare delle trasformazioni geometriche Shape: crea una forma composta da un oggetto geometrico e da un aspetto Cylinder: una delle varie primitive geometriche Material: definizione delle proprietà della superficie Transform: per adesso nessuna traformazione; utile racchiudere in un transform ogni oggetto geometrico che si vuole gestire independentemente
Nodo Transform (1) Transform : X3DGroupingNode { MFNode [in,out] children [] [X3DChildNode] MFNode [in] addChildren [X3DChildNode] MFNode [in] removeChildren [X3DChildNode] SFVec3f [in,out] center 0 0 0 SFVec3f [in,out] translation 0 0 0 SFRotation [in,out] rotation 0 0 1 0 SFVec3f [in,out] scale 1 1 1 SFRotation [in,out] scaleOrientation 0 0 1 0 ... } Transform children addChildren removeChildren center rotation translation scale scaleOrientation · · · Esaminare nei dettagli la specifica: SF... MF... Valori iniziali, campi solo input come eventi in entrata, interfacce astratte ScaleOrientation di tipo Rotation La presenza di un attributo del tipo SFNode o MFNode indica che questo nodo sarà padre di altri nodi Definisce un sistema di coordinate locale per i nodi contenuti in children Effettua una trasformazione geometrica data da: Un ridimensionamento (anche non-uniforme) rispetto ad un punto arbitrario Una rotazione rispetto ad un asse e ad un punto arbitrari Una traslazione
Nodo Transform (2) Regole generali: Transform : X3DGroupingNode { MFNode [in,out] children [] [X3DChildNode] MFNode [in] addChildren [X3DChildNode] MFNode [in] removeChildren [X3DChildNode] SFVec3f [in,out] center 0 0 0 SFVec3f [in,out] translation 0 0 0 SFRotation [in,out] rotation 0 0 1 0 SFVec3f [in,out] scale 1 1 1 SFRotation [in,out] scaleOrientation 0 0 1 0 ... } <Transform DEF = “” USE = “” center = “0 0 0” translation = “0 0 0” rotation = “0 0 1 0” scale = “1 1 1” scaleOrientation = “0 0 1 0” ... > Nodi discendenti da X3DChildNode (campo children) </Transform> Esaminare nei dettagli la specifica: SF... MF... Valori iniziali, campi solo input come eventi in entrata, interfacce astratte ScaleOrientation di tipo Rotation La presenza di un attributo del tipo SFNode o MFNode indica che questo nodo sarà padre di altri nodi Regole generali: I campi di tipo SFNode o MFNode sono compresi tra il tag di apertura e quello di chiusura Tutti gli altri campi sono definiti come attributi del tag Gli attributi DEF e USE permettono di attribuire un nome al nodo e di instanziarlo successivamente
Esempio <Transform translation=“-2 0 0”> <Transform DEF=“Cilindro Ruotato” rotation=“0 0 1 0.78”> <Shape> <Cylinder/> <Appearance> <Material diffuseColor=“1.0 0.4 0.0”/> </Appearance> </Shape> </Transform> <Transform translation=“2 0 0”> <Transform USE=“Cilindro Ruotato”/> Cilindro Ruotato Cilindro Ruotato ATTENZIONE!!!! Ho usato due Transform per poterne riutilizzare una... In questo caso avrei potuto anche utilizzarne una sola perché l’ordine delle trasformazioni corrisponde a quello desiderato, ma non è sempre così!!!!
Nodo Shape Shape Shape : X3DShapeNode { SFNode [in,out] geometry NULL [X3DGeometryNode] SFNode [in,out] appearance NULL [X3DAppearanceNode] ... } Shape geometry appearance · · · <Shape DEF = “” USE = “” ... > Un nodo discendente da X3DGeometryNode (campo geometry) X3DAppearanceNode (campo appearance) </Shape> Dire che inserire più di un nodo di un tipo tra i tag genera errore!!!! Campo SF.. e non MF..!!!!
Nodo Appearance Appearance Appearance : X3DAppearanceNode{ SFNode [in,out] material NULL [X3DMaterialNode] SFNode [in,out] texture NULL [X3DTextureNode] SFNode [in,out] textureTransform 0 0 1 0 [X3DTextureTransformNode] ... } Appearance material texture textureTransform · · · <Appearance DEF = “” USE = “” ... > Un nodo discendente da X3DMaterialNode (campo material) X3DTextureNode (campo texture) X3DTextureTransformNode (campo textureTransform) </Appearance>
Nodo Material (1) Material Material : X3DMaterialNode{ SFFloat [in,out] ambientIntensity 0.2 SFColor [in,out] diffuseColor 0.8 0.8 0.8 SFColor [in,out] emissiveColor 0 0 0 SFFloat [in,out] shininess 0.2 SFColor [in,out] specularColor 0 0 0 SFFloat [in,out] transparency 0 ... } Material ambientIntensity diffuseColor emissiveColor shininess specularColor transparency · · · <Material DEF = “” USE = “” ambientIntensity = “0.2” diffuseColor = “0.8 0.8 0.8” emissiveColor = “0 0 0” shininess = “0.2” specularColor = “0 0 0” transparency = “0” ... > </Material>
Nodo Material (2) diffuseColor specularColor shininess emissiveColor Dipendente dall’angolo tra la normale e il raggio luminoso incidente specularColor Dipendente dall’angolo tra la direzione dello sguardo e il raggio luminoso riflesso shininess Determina l’ampiezza del riflesso emissiveColor Colore dato da una auto-illuminazione dell’oggetto stesso (indipendente dalle sorgenti luminose) ambientIntensity Fattore moltiplicativo del colore (indipendente dalla posizione delle fonti luminose)
Primitive geometriche (1) Semplici forme geometriche derivate dal nodo X3DGeometryNode e utilizzabili nel nodo Shape: Box : X3DGeometryNode{ SFVec3f [] size 2 2 2 SFBool [] solid TRUE ... } Cone : X3DGeometryNode{ SFFloat [] bottomRadius 1 SFFloat [] height 2 SFBool [] bottom TRUE SFBool [] side TRUE SFBool [] solid TRUE ... } È importante capire il posizionamento rispetto agli assi
Primitive geometriche (2) Cylinder : X3DGeometryNode{ SFFloat [] height 2 SFFloat [] radius 1 SFBool [] bottom TRUE SFBool [] top TRUE SFBool [] side TRUE SFBool [] solid TRUE ... } Sphere : X3DGeometryNode{ SFFloat [] radius 1 SFBool [] solid TRUE ... } È importante capire il posizionamento rispetto agli assi Campo solid: se TRUE i poligono si vedono solo in direzione della normale Dato che i campi sono di tipo InputOnly si agirà su Transform per variarne le dimensioni!!!!!!!!!!!!! Esempio!!!!!!!!!!! Commento su PivotPoint Introduzione a NavigationInfo e Viewpoint Tutti i nodi discendenti da X3DGeometryNode hanno un campo solid (SFBool) I campi sono tutti di tipo InitializeOnly