Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies

Slides:



Advertisements
Presentazioni simili
Introduzione al DTD Mario Arrigoni Neri.
Advertisements

Introduzione ad XML Mario Arrigoni Neri.
1 Introduzione ad XML. 2 Problemi con SGML Complesso da comprendere ed utilizzare Non è pensato per la rete: mancano link ipertestuali e specifiche grafiche.
Lezione 18 MIDI e XML Programmazione MIDI (Prof. Luca A. Ludovico)
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Algoritmi e Programmazione
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Query OQL e XQUERY a confronto
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
Introduzione al linguaggio C
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
XML Prof. Barbara Pernici Politecnico di Milano. Introduzione a XML.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Introduzione alla Object Oriented Programming, OOP E.Mumolo. DEEI
Texture Mapping.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
E.Mumolo. DEEI Introduzione alla programmazione ad oggetti in C++ Object Oriented Programming, OOP E.Mumolo. DEEI
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking
1 Costruzione di Interfacce Primi passi in OpenGL
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + Opengl
Costruzione di Interfacce Lezione 12 C++STL
22 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Texturing
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 30 MMeditor e collision detection
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Costruzione di Interfacce Lezione 16 Qt
1 Costruzione di Interfacce Primi passi in OpenGL
2 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 23 Scene Graphs, Object Loading
Costruzione di Interfacce Lezione 8 Rasterizzazione
Introduzione al linguaggio C++ 5 lezioni
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
XML e DTD. –il "PROLOG contiene: dichiarazione della versione di XML; commenti (facoltativi); dichiarazione del DOCUMENT TYPE. –il "DOCUMENT INSTANCE.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Struct, enum, Puntatori e Array dinamici
I File.
Espressioni condizionali
Importanza DTD La DTD (Document Type Definition) consente di dichiarare in maniera univoca la struttura di markup mediante la definizione dello schema.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
PHP - PHP: Hypertext Preprocessor. Introduzione PHP (acronimo ricorsivo per "PHP: Hypertext Preprocessor") è un linguaggio di scripting general-purpose.
CORSO DI PROGRAMMAZIONE II Lezione 22
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,
Programmazione in linguaggio C
JavaScript Generalità Cos'è JavaScript?
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Laboratorio di Servizi Web - XML - Ardissono 1 Rappresentazione ad oggetti di documenti XML Parser fanno analisi sintattica di documento XML ma, a meno.
A.a. 2004/05Tecnologie Web1 Introduzione a XML: Document Type Definition; parser XML; XML-schema; eXtensible Stylesheet Language.
TW Asp - Active Server Pages Nicola Gessa. TW Nicola Gessa Introduzione n Con l’acronimo ASP (Active Server Pages) si identifica NON un linguaggio di.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
2 Indice Un esempio Che cosa è A cosa serve Confronto con HTML Punti di forza La sua struttura.
XML (eXtensible Markup Language). XML è stato progettato per descrivere dati HTML è stato progettato per visualizzare dati XML (eXtensible Markup Language)
XVRC2 Emanuele Ruffaldi Giugno Tre esperimenti con S3D ► Estensioni del Linguaggio ► Pre-Compilatore ► Esecuzione dentro il Java L C J.
Transcript della presentazione:

Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies

Costruzione di Interfacce - Paolo Cignoni2.pro files Come migliorare lintegrazione tra.net e designer. nel passare da designer a.net si perdono alcune cose opzioni di compilazione (include dir lib ecc) file cpp da aggiungere al progetto debug? Si puo gestire tutto modificando a mano il file.pro (sono file ascii)

Costruzione di Interfacce - Paolo Cignoni3 default.pro SOURCES+= CIGLWidget.cpp main.cpp HEADERS+= CIGLWidget.h unix { UI_DIR =.ui MOC_DIR =.moc OBJECTS_DIR =.obj } FORMS= mainform.ui IMAGES= images/editcopy \ images/editcut \ images/editpaste \... images/editpaste_1 \ images/searchfind_1 TEMPLATE=app CONFIG+= qt warn_on release LANGUAGE= C++

Costruzione di Interfacce - Paolo Cignoni4 Moebius3ds.pro SOURCES+= CIGLWidget.cpp \ main.cpp CIMoebius.cpp vcg/CITrackBall.cpp vcg/CI3ds.cpp HEADERS+= CIGLWidget.h CIMoebius.h INCLUDEPATH += C:/CODE/lib3ds unix { UI_DIR =.ui MOC_DIR =.moc OBJECTS_DIR =.obj } unix:LIBS += -llib3ds win32:LIBS += c:\CODE/lib3ds-1.2.0/lib3ds-120s.lib FORMS= mainform.ui IMAGES= images/editcopy \ images/editcut \... images/searchfind_1 TEMPLATE=app CONFIG+= qt warn_on release debug opengl LANGUAGE= C++

Costruzione di Interfacce - Paolo Cignoni5.pro details Per aggiungere file cpp da compilare += tra i SOURCES (attenti ai path); directory aggiuntive per gli include += tra i INCLUDEPATH Per lib aggiuntive differente a seconda win o linux config aggiuntive opengl : aggiunge le lib per opengl automaticamente debug aggiunge una modalita di compilazione in debug.

Costruzione di Interfacce - Paolo Cignoni6 SDL e QT vogliamo integrare alcune feature di SDL con QT SDL gestisce molto bene: fullscreen e resize modalita video QT gestisce molto bene loading immagini parsing xml ecc. facciamo un mix dei due

Costruzione di Interfacce - Paolo Cignoni7 SDLMoebius.pro TEMPLATE = app CONFIG += console debug release opengl INCLUDEPATH +=.;c:\code\SDL-1.2.6\include LIBPATH += c:\code\SDL-1.2.6\lib unix:LIBS += -lmath -L/usr/local/lib win32:LIBS += sdlmain.lib sdl.lib # Input HEADERS += vcg\Matrix44.h vcg\Point3.h vcg\Point4.h vcg\Utility.h SOURCES += main.cpp CIMoebius.cpp

Costruzione di Interfacce - Paolo Cignoni8 main.cpp int main(int argc, char **argv) { QApplication QApp(argc, argv ); SDL_Init(SDL_INIT_VIDEO) < 0 ); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_SetVideoMode(640, 480, 0, SDL_OPENGL |SDL_FULLSCREEN); CIMoebius::myShape s; s.BuildNGon(3,1); ring.GenerateMoebiusRing(s,36,3,120); int done = 0, ret; myGLReshapeFunc(640,480);...

Costruzione di Interfacce - Paolo Cignoni9 main.cpp while ( ! done ) { SDL_Event event; ret=SDL_PollEvent(&event); if(ret) switch(event.type){ case SDL_QUIT : done = 1; break ; case SDL_KEYDOWN : if ( event.key.keysym.sym == SDLK_ESCAPE ) done = 1; if ( event.key.keysym.sym == SDLK_SPACE ) QMessageBox::information(0,"asdfads","Asdfadsf"); break; case SDL_VIDEORESIZE: SDL_SetVideoMode(event.resize.w,event.resize.h,0,SDL_OPENGL |SDL_FULLSCREEN); myGLReshapeFunc(event.resize.w,event.resize.h); break; } else DrawGLScene(); } SDL_Quit(); return 1; }

Costruzione di Interfacce - Paolo Cignoni10 main.cpp, InitGL QImage tt; tt.load("Texture.png"); QImage tx = QGLWidget::convertToGLFormat ( tt); printf("QImage loaded %i %i \n",tt.size().width(),tt.size().height()); GLuint texName; glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexImage2D( GL_TEXTURE_2D, 0, 3, tx.width(), tx.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tx.bits() ); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, tx.width(), tx.height(), GL_RGBA, GL_UNSIGNED_BYTE, tx.bits() ); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR) ; glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

Costruzione di Interfacce - Paolo Cignoni11 XML Cosè XML? acronimo di eXtensible Markup Language è un linguaggio estensibile realizzato per poter definire ed utilizzare in modo semplice documenti strutturati Nato e studiato per il Web, Molto utile al difuori del contesto web per definire generici formati di interscambio di dati. XML è molto di più di quello che vedrete qui…

Costruzione di Interfacce - Paolo Cignoni12 Esempio xml Sig. Mario Rossi Via Verdi Pisa

Costruzione di Interfacce - Paolo Cignoni13 Xml Basato sulluso di markup per delimitare porzioni del documento Un mark-up è quello compreso tra <> Detto anche tag, o etichetta I tag devono essere annidati XML non ha tag predefiniti è estensibile consente di definire nuovi linguaggi è un metalinguaggio Uno degli obiettivi di progettazione di XML: deve essere in un formato leggibile dalluomo è ascii.

Costruzione di Interfacce - Paolo Cignoni14 Xml I documenti xml sono strutturati in tre parti, (le prime due sono opzionali) 1.XML processing instruction: identifica la versione di XML usata e come è codificata e se riferisce altri file: 2.document type declaration (DTD): che o contiene al suo interno una dichiarazione formale di quali tag (e come) il doc usa (internal subset), o riferisce un file che contiene tali dichiarazioni: (external subset), 3.Il doc xml vero e proprio il cui elemento radice corrisponde con il tipo specificato nel dtd. Tutti gli altri tag sono nestati in questo.

Costruzione di Interfacce - Paolo Cignoni15 Xml dettagli Sintassi È case sensitive Elemento: ciò che è racchiuso da una coppia … Un tag può avere attributi Valida anche la sintassi Commenti

Costruzione di Interfacce - Paolo Cignoni16 XML Perchè usiamo xml? Perchè aiuta molto nella definizione del formato di file della nostra applicazione No problemi di parsing. Estendibilità innata (è facile fare backward compatibility) Facile gestire set non ordinati Facile gestire assenza di elementi Fa sempre comodo conoscere una tecnologia in più

Costruzione di Interfacce - Paolo Cignoni17 XML e linguaggi oo Ad ogni classe corrisponde un elemento I membri di una classe sono naturalmente annidati. Corrispondenza naturale tra strutture dati e formato xml

Costruzione di Interfacce - Paolo Cignoni18 Esempio Sig. Mario Rossi Via Verdi Pisa class BusinnesCard { public: Persona m_pers; Indirizzo m_ind; }; class Persona {public: string m_titolo; string m_nome; string m_cognome; }; class Indirizzo {public: string m_strada; string m_numero int m_cap; string m_citta; }

Costruzione di Interfacce - Paolo Cignoni19 Xml in pratica Generare xml è assai facile La via del praticone: printf( %i,val); Facile ma possibilità di fare errori di sintassi xml… Appoggiandosi a QT

Costruzione di Interfacce - Paolo Cignoni20 Modello DOM I parser xml appartengono a due grosse categorie DOM: Document Object Model Leggono tutto un file xml e restituiscono un oggetto c++ (o in qualunque altro linguaggio) che memorizza tutto lalbero con tutti gli elementi e gli attributi. Lapplicazione poi naviga lalbero con calma. SAX: Simple Api for Xml Generano eventi durante la lettura che devono essere gestiti dallapplicazione

Costruzione di Interfacce - Paolo Cignoni21 Yet another xml parser Di parser xml ne esistono molti (sia microsoft, che legati al linguaggio) in vcg/xml/xml.h trovate una classe xmldoc che implementa (+ o -)un parser dom minimale, nel senso di numero di linee di codice. Basata principalmente sulle stl Non efficientissima, ma leggibile (~300 righe di codice tra.h,.y e.l)

Costruzione di Interfacce - Paolo Cignoni22 Vcg/Xml Due classi: XmlDoc Rappresenta tutto un documento xml dopo che è stato parsato da un file XmlDoc xd; xd.read(myfile.xml); La radice dellalbero xml è in Xd.start; Xml nodo dellalbero; Ogni nodo contiene: string id; // il tag string content; map attr; vector children;

Costruzione di Interfacce - Paolo Cignoni23 Vcg/xml Dopo che si è parsato un file xml, occorre fare a mano la creazione delle classi corrispondenti ai vari nodi Molto facile se si fa tutto con la stessa interfaccia. Per ogni classe che si vuole rendere persistente si aggiunge due funzioni XMLWrite(FILE *fp) XMLRead(Xml& xml); E si usa tutto ricorsivamente

Costruzione di Interfacce - Paolo Cignoni24 Scene Graph Il problema principale è che il mio documento/scena non è affatto strutturato. Scriviamoci il nostro semplicissimo scene graph ad hoc Cosa ci deve stare dentro? Mesh trasformazioni Animazioni

Costruzione di Interfacce - Paolo Cignoni25 CSG La scena la assumo strutturata come un albero Assumo che ogni nodo sia riferito solo una volta. Due classi principali CSG: contiene lintero scene graph (la radice) CSGNode: generico nodo dello scene graph, lo faccio come classe astratta;

Costruzione di Interfacce - Paolo Cignoni26 CSGNode class CSG {public: CSG(void); ~CSG(void); CSGGroup root; }; class CSGNode {public: virtual ~CSGNode(void){}; virtual void glDraw(const float DocTime)=0; }; Notare che La draw prende in ingresso un tempo che verrà usato o meno La draw è una funzione pure virtual, quindi la classe CSGNode non è istanziabile Tutto quello che mi serve lo derivo da CSGNode, specializzando distruttore e glDraw.

Costruzione di Interfacce - Paolo Cignoni27 CSGGroup Nodo principale per rappresentare un gruppo di nodi È quello che definisce lo scope delle trasformazioni di modellazione Si assume che i figli possano cambiare la modelview modificando lo stato per i successivi fratelli Lordine dei figli è significativo È responsabile della disallocazione dei nodi.

Costruzione di Interfacce - Paolo Cignoni28 CSGGroup class CSGGroup :public CSGNode {public: virtual ~CSGGroup(); typedef list ::iterator iterator; list Sons; virtual void glDraw(const float DocTime); }; CSGGroup::~CSGGroup() //distruttore: disalloca tutti i figli { for(iterator i=Sons.begin();i!=Sons.end();++i) delete (*i); } void CSGGroup::glDraw(const float DocTime) { glPushMatrix(); for(iterator i=Sons.begin();i!=Sons.end();++i) (*i)->glDraw(DocTime); glPopMatrix(); }

Costruzione di Interfacce - Paolo Cignoni29 CISGTransformation Classe che incapsula una generica, statica trasformazione (o composizione di varie trasformazioni) class CSGTransformation :public CSGNode { public: Matrix44f m; virtual void glDraw(const float DocTime); }; void CSGTransformation::glDraw(const float DocTime) { glMultMatrix(m); };

Costruzione di Interfacce - Paolo Cignoni30 CISGAnimRotation Classe che incapsula una rotazione animata, notare che il tempo da visualizzare arriva da fuori. class CSGAnimRotation :public CSGNode { public: Point3f axis; float AngularSpeedDPS; //Degree Per Sec; float StartAngleDeg; virtual void glDraw(const float DocTime); }; void CSGAnimRotation ::glDraw(const float DocTime) { float CurAngleDeg = StartAngleDeg + DocTime*AngularSpeedDPS ; glRotatef(CurAngleDeg, axis[0],axis[1],axis[2]); };

Costruzione di Interfacce - Paolo Cignoni31 CISGAnimZPrecession Moto di precessione animato sullasse Z class CSGAnimZPrecession :public CSGNode {public: CSGAnimZPrecession(); virtual ~CSGAnimZPrecession(){}; float DeclinationDeg; float AngularSpeedDPS; //Degree Per Sec; float StartAngleDeg; virtual void glDraw(const float DocTime); }; CSGAnimZPrecession::CSGAnimZPrecession() {StartAngleDeg=0;AngularSpeedDPS=10;DeclinationDeg=30;} void CSGAnimZPrecession::glDraw(const float DocTime) { // precessione: una rotazione il cui asse ruota intorno all'asse z float CurAngleRad=ToRad(StartAngleDeg + DocTime*AngularSpeedDPS); glRotated( DeclinationDeg,cos(CurAngleRad),sin(CurAngleRad),0); };

Costruzione di Interfacce - Paolo Cignoni32 Modifichiamo MoebiusStrip Deriviamo CIMoebius da CISGNode In questo modo diventa un oggetto che può far parte dello scene graph. Adattiamo la funzione draw Aggiungiamo il distruttore virtuale (che non fa nulla)

Costruzione di Interfacce - Paolo Cignoni33 Usiamo lo SceneGraph Nel main.cpp aggiungiamo un membro: CISG Scene; OnNewDocument: aggiungiamo la costruzione dello scene graph Scene.root.Sons.push_back(new CSGAnimZPrecession()); CIMoebius *ms=new CIMoebius (); ms->Generate(); Scene.root.Sons.push_back(ms);\ Notare come si crei apposta un oggetto CIMoebius con la new anziché passargli lindirizzo di un oggetto esistente. Questo per evitare che poi il distruttore del gruppo faccia pasticci cercando di disallocare qualcosa non allocato con la new

Costruzione di Interfacce - Paolo Cignoni34 Usiamo lo SceneGraph Nella funzione di disegno della classe aggiungiamo: Scene.root.glDraw(clock()/1000.0f); Si dovrebbe fare la stessa cosa con tutto il resto (omini, pallina ecc)