Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni

Slides:



Advertisements
Presentazioni simili
CUDA & OpenMP parallel programming.
Advertisements

INFORMATICA Altre Istruzioni di I/O
Esercitazioni If nidificati
Uso avanzato di C.
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
INFORMATICA Strutture iterative
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
OpenGL Libreria grafica composta da circa 150 comandi. Realizzata in vari linguaggi (noi useremo quella in C). Sviluppato dalla Silicon Graphics. Originariamente.
Gerarchie di Oggetti Tutti i sistemi avanzati di grafica (PHIGS, OpenGL, DirectDraw, …) permettono di definire un modello come una gerarchia di oggetti.
Corso di Informatica grafica 1 Introduzione Quando si rappresentano modelli di oggetti 3D costituiti da facce poligonali secondo delle proiezioni alcune.
3 D.
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
Computer Graphics Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2005/06 Lezione.
Costruzione di Interfacce Lezione 4 Sistemi di riferimento e trasformazioni
Sistemi Multimediali II Marco Tarini Università dellInsubria Facoltà di Scienze MFN di Varese Corso di Laurea in Informatica Anno Accademico 2004/05 Lezione.
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 4 Nozioni di geometria per la grafica
Costruzione di Interfacce Lezione 4 Geometria per la grafica
Costruzione di Interfacce Lezione 18 Qt Tutorial 2
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Matrici di Proiezione Prospettica
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 24 Scene Graphs e Xml for dummies
6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver
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
Costruzione di interfacce Paolo Cignoni
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
INFORMATICA GRAFICA – SSD ING-INF/05 Sistemi di elaborazione delle informazioni a.a. 2007/2008 Esercitazione OpenGL.
INFORMATICA GRAFICA – SSD ING-INF/05 Sistemi di elaborazione delle informazioni a.a. 2006/2007 LEZIONE PRATICA OpenGL Graphics LEZIONE PRATICA OpenGL Graphics.
I Thread.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
1 Programmazione grafica: lInterazione Daniele Marini.
Lavorare con le matrici in OGL
void binario(int n); …………………
Creazione progetto in C++/DEV
Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Trasformazioni in OGL Daniele Marini.
Cammini minimi da un sorgente
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Trasformazioni in OGL Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
Sistemi di riferimento
Primitive grafiche e interazione Daniele Marini Davide Gadia Marco Ronchetti Davide Selmo Corso Di Programmazione Grafica aa2005/2006.
Primitive grafiche e interazione Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Picking - OpenGL Disegno della scena (display) Impostazione parametri selezione Ripristino parametri Loop Selezione.
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Display list e picking Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
Primitive OpenGL Corso di Programmazione Grafica e Laboratorio Daniele Marini.
1 Programmazione grafica: l’Interazione Daniele Marini.
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,
Programmazione in linguaggio C
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Costruzione di Interfacce Lezione 18 MFC e OpenGL
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 13 e 14 GESTIONE DEI FILE A) Nozioni sulla gestione dei.
Ingegneria del software Modulo 1 - Introduzione al processo software Unità didattica 5 -Test e verifica Ernesto Damiani Università degli Studi di Milano.
Grafica interattiva a.a. 2003/2004 Docente: Prof. Enrico Puppo Laboratorio: Dott. Paola Magillo.
Transcript della presentazione:

Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni2 Skeleton SDL #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include #endif #include void DrawGLScene() { glClear(GL_COLOR_BUFFER_BIT); SDL_GL_SwapBuffers(); } void myGLReshapeFunc(GLsizei w, GLsizei h) { glMatrixMode (GL_PROJECTION); glLoadIdentity (); float ratio=(float)w/(float)h; glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_MODELVIEW); } …

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni3 Skeleton SDL int main(int argc, char **argv) { if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError()); exit(1); } if ( SDL_SetVideoMode(640, 480, 0, SDL_OPENGL |SDL_RESIZABLE) == NULL ) { fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError()); SDL_Quit(); exit(2); } /* Loop, drawing and checking events */ int done = 0; myGLReshapeFunc(640,480); while ( ! done ) { SDL_Event event; SDL_WaitEvent(&event); switch(event.type) { case SDL_VIDEOEXPOSE : DrawGLScene(); break; case SDL_QUIT : done = 1; break ; case SDL_KEYDOWN : if ( event.key.keysym.sym == SDLK_ESCAPE ) done = 1; break; case SDL_VIDEORESIZE : SDL_SetVideoMode(event.resize.w,event.resize.h, 0, SDL_OPENGL |SDL_RESIZABLE); myGLReshapeFunc(event.resize.w,event.resize.h); break; } SDL_Quit(); return 1; }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni4 Obiettivo Costruire una serie di anelli di moebius fatti di blocchettini: 1.Costruire un blocchettino e definire il suo sistema di riferimento 2.Usarlo per costruire un anello nello sistema di riferimento dellanello 3.Piazzare i vari anelli nel sistema di riferimento del mondo

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni5 Aggiungiamo un cubo Sistema di riferimento del blocchetto: Centrato nellorigine. Scriviamo una funzione che disegna un blocchetto in wireframe DrawBlock(float xsize, ysize, zsize); x y

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni6 DrawBlock Disegno i 12 edge di un box3d void DrawBlock(float xsz, float ysz, float zsz) { glBegin(GL_LINES); glVertex3f(-xsz, ysz, zsz); glVertex3f( xsz, ysz, zsz); glVertex3f(-xsz,-ysz, zsz); glVertex3f( xsz,-ysz, zsz); glVertex3f( xsz, ysz, zsz); glVertex3f( xsz,-ysz, zsz); glVertex3f(-xsz, ysz, zsz); glVertex3f(-xsz,-ysz, zsz); glVertex3f( xsz, ysz, zsz); glVertex3f( xsz, ysz,-zsz); glVertex3f(-xsz, ysz, zsz); glVertex3f(-xsz, ysz,-zsz); glVertex3f( xsz,-ysz, zsz); glVertex3f( xsz,-ysz,-zsz); glVertex3f(-xsz,-ysz, zsz); glVertex3f(-xsz,-ysz,-zsz); glVertex3f(-xsz, ysz,-zsz); glVertex3f( xsz, ysz,-zsz); glVertex3f(-xsz,-ysz,-zsz); glVertex3f( xsz,-ysz,-zsz); glVertex3f( xsz, ysz,-zsz); glVertex3f( xsz,-ysz,-zsz); glVertex3f(-xsz, ysz,-zsz); glVertex3f(-xsz,-ysz,-zsz); glEnd(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni7 Testiamo la nostra funzione Mai fare tutto assieme Cerchiamo di visualizzare subito il nostro blocchetto In questo caso il nostro sistema di riferimento di mondo e quello del blocchetto stesso. Quindi basta settare la trasf di projection e la trasf da world a camera: gluPerspective e glulookat

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni8 Visualizzare il blocchetto Matrice di proiezione definisce il volume di vista in spazio di camera, ha bisogno: dellaspect ratio della finestra (tutto il volume di vista viene mappato nella finestra quindi deve avere le stesse proporzioni) Range di distanze entro cui visualizzo gli oggetti Lo setto nella Reshape void myGLReshapeFunc(GLsizei w, GLsizei h) { glMatrixMode (GL_PROJECTION); glLoadIdentity (); float ratio=(float)w/(float)h; gluPerspective(45,ratio,3,10); glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_MODELVIEW); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni9 Visualizzo il blocchetto Matrice di modellazione Passa da spazio di mondo a spazio di camera. Ha bisogno di sapere, in spazio di mondo: Da dove, in che direzione e con che orientamento Si sta guardando la nostra scena. La settiamo nella drawScene e si assume di guardare nellorigine void DrawGLScene() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); gluLookAt(2,2,5,0,0,0,0,1,0); DrawBlock(1,1,1); DrawBlock(1.5,.5,.5); SDL_GL_SwapBuffers(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni10 Sistema di riferimento dellanello Centrato sullorigine Sul piano xz Si costruisce con una serie di blocchetti che vanno rototraslati prima di essere disegnati x z

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni11 Ruotiamo il cubo Rototraslare il cubo significa Risposta semplice faccio una glRotate e una glTranslate prima di disegnare il cubo Risposta vera Cambio il sistema di riferimento della camera rispetto al sistema di riferimento del cubo. Nota: glRotate e glTranslate modificano la matrice corrente, quindi uso glPushMatrix e glPopMatrix per far trovare ad ogni cubetto rototraslato sempre lo stesso stato iniziale

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni12 Composizione di trasformazioni Fare glRotate glTranslate E ben diverso di glTranslate glRotate Poiché le matrici si compongono per post moltiplicazione lordine sembra quello inverso… Trucco: per visualizzare il risultato partire dallultima trasformazione e applicarle allindietro…

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni13 Rototraslazione del cubo glRotatef(i*20,0,0,1); glTranslatef(1,0,0); x y

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni14 Proviamo a disegnare un anello Scriviamo una funzione abbastanza generica per fare un anello di blocchettini void DrawRing(int step, float r) { float angle=360.0f/step; for(int i=0;i<step;++i) { glPushMatrix(); glRotatef(i*angle,0,1,0); glTranslatef(r,0,0); DrawBlock(1.5,.5,.5); glPopMatrix(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni15 Proviamo Cambiamo anche linquadratura per prendere tutto lanello. Nota state attenti al range della gluPerspective! void DrawGLScene() { glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); gluLookAt(2,5,10,0,0,0,0,1,0); DrawRing(18,3); SDL_GL_SwapBuffers(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni16 Esercizio 2 Trasformare la striscia in un anello di Moebius. hint: basta solo una rotazione in piu Basta ruotare il cubo prima di iniziare la rototraslazione che lo mette nella propria posizione allinterno dellanello

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni17 Moebius Ring void DrawRing(int step, float r, int twist) { float angle=360.0f/step; float angletwist=(180.0f*twist)/step; for(int i=0;i<step;++i) { glPushMatrix(); glRotatef(i*angle,0,1,0); glTranslatef(r,0,0); glRotatef(i*angletwist,0,0,1); DrawBlock(1.5,.5,.5); glPopMatrix(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni18 Animazione Come si fa animazione in unapplicazione event driven? Vietato disegnare continuamente un frame dopo laltro senza mai uscire dalla callback di display!! Si deve disegnare un frame e guardare se non ce altro di importante da fare prima.

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni19 Idle Processing Tutte le ide che non esplicitano il loop degli eventi, mettono a disposizione una callback (evento) che scatta scattare quando non hanno nulla da fare (idle processing) Le varie app vengono cosi chiamate ogni qual volta il so non ha altro da fare. NOTA: Non si ha alcuna garanzia di QUANDO si viene chiamati…

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni20 Animating Tutti i calcoli relativi alle posizioni, orientamento durante le animazioni DEVONO essere temporizzati. Per rendere il cambio di fotogramma stabile, si usa la tecnica del double buffering; Si disegna la scena in un buffer nascosto e si mostra solo quando abbiamo finito. SDL_GL_SwapBuffers();

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni21 Animazione Temporizzazione: Fondamentale. Meccanismo base: Esprimo tutti i movimenti che in unita assolute (e.g. m/sec, gradi/sec ecc) Per ogni frame Guardo quanto tempo e passato Aggiorno le variabili di stato (e.g. posizione e orinetamento) in funzione di quanto tempo e passato. Usare i timer e un po meno affidabile.

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni22 Animazione in SDL Cambiamo la funzione che preleva gli eventi in una non bloccante. Aggiungiamo nella funzione di disegno delle variabili statiche per tener traccia del tempo che passa.

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni23 Moebius Ring 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; break; case SDL_VIDEORESIZE: SDL_SetVideoMode(event.resize.w,event.resize.h, 0, SDL_OPENGL |SDL_RESIZABLE); myGLReshapeFunc(event.resize.w,event.resize.h); break; } else DrawGLScene(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni24 Moebius Ring void DrawGLScene() { static LastT=clock(); static float CurAngle=0; int CurT=clock(); float DeltaT=(CurT-LastT)/1000.0; // elapsed time in secs. if(DeltaT < 0.01) return; LastT=CurT; float AngularSpeed = 90; // in degree/sec CurAngle+=AngularSpeed*DeltaT; glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); gluLookAt(2,5,12,0,0,0,0,1,0); glRotatef(CurAngle,0,1,0); DrawRing(18,5,1); SDL_GL_SwapBuffers(); }

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni25 Sempre piu difficile Aggiungiamo nellordine Lanello che e formato da una doppia striscia Una pallina che rotola sullanello Lanello che ruota su se stesso

10 Ott 2003Costruzione di Interfacce - Paolo Cignoni26 Esercizio Aggiungete una serie di anelli di moebius e spostate la camera in modo che si vedano tutti. Tutti gli anelli devono ruotare intorno al proprio asse