INFORMATICA GRAFICA. 5 Maggio Interattività. Michele Antolini

Documenti analoghi
INFORMATICA GRAFICA!

RIEPILOGO DRAWING INTRODUZIONE DRAWING EVENT MANAGEMENT VIEWING DOUBLE BUFFERING Z-BUFFERING LIGHTING

INFORMATICA GRAFICA. 27 Aprile Introduzione a OpenGL parte 2. Michele Antolini

INFORMATICA GRAFICA. 28 Aprile Trasformazioni - Illuminazione. Michele Antolini

Moebius8. CFormView. CFormView. CSplitterWnd. Doppia View. Partiamo nuovamente da zero

Libreria grafica: OpenGL. Come realizzare semplici simulazioni video in C con OpenGL

INFORMATICA GRAFICA. 20 Aprile Introduzione a OpenGL. Michele Antolini michele.antolini@mail.polimi.it

INFORMATICA GRAFICA. 25 Marzo Introduzione a OpenGL. Michele Antolini

INFORMATICA GRAFICA. 12 Maggio Display lists, blending, fog. Michele Antolini

Introduzione a OpenGL e alle GLUT

Introduzione. Costruzione di Interfacce Primi passi in OpenGL. Sierpinski Gasket. Sierpinski gasket. Event driven programming. Stuttura del programma

GAME DEV: tools programming. Parte 2: programming

- int nbrani = 0; //numero di brani presenti in archivio. int creaplaylist(tipobrano[] playlist, int n, TipoGenere g, TipoFile t);

INFORMATICA GRAFICA!

OpenGL: visualizzazione 3D

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Introduzione SOMMARIO

Lezione 8: Stringhe ed array multidimensionali

Corso di VIDEOGAMES. PROGETTO Labirinto. Guida alla creazione di un VIDEOGAMES. Parte SECONDA Creiamo il Labirinto ed iniziamo a Muovere il Giocatore

Cosa serve per cominciare?

Fondamenti di Programmazione

Capitolo 5 - Funzioni

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Strategie di programmazione

Grafica Computazionale

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Interazione con il DOS e il BIOS

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Le funzioni. Fondamenti di programmazione

ESERCIZIO: Analisi di un programma. Dato il seguente programma C:

Capitolo 5 -- Stevens

Sommario Accettazione:... 3 Numerazione code:... 3 Emissione ricevuta:... 4 Aggiunta prestazione in cassa:... 5

float somma_float(float a, float b) int get_ascii(char c)

Esercitazione 6. Array

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Funzioni. Unità 1. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Elenco comandi. Apre un progetto precedentemente salvato. Avvia il programma in memoria: la tartaruga si muove lentamente.

Array. Aggragati di variabili omogenee...

Corso di Informatica A.A

Le funzioni, e le istruzioni di input/output

Esempi di programmi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E01. A. Miola Settembre 2007

Fondamenti di Informatica: Ingegneria Meccanica Prova scritta del 12 luglio 2008

ESERCIZIO Grammatiche (1) ESERCIZIO Grammatiche (1) Espressioni algebriche

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 05 Array. Lab06 1

1

Esercizio 1 Soluzione

Perché il linguaggio C?

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Ambienti di Programmazione per il Software di Base

Fondamenti di Informatica T-1 Modulo 2

Informatica per Statistica Riassunto della lezione del 21/10/2011

Ingresso ed Uscita in C. Informatica 1 / 15

Intro ai tools di MARS

Informatica 1. Prova di recupero 21 Settembre 2001

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Libreria grafica libplot

Lettura da tastiera e scrittura su monitor

Costruzione di Interfacce Lezione 12 Esercitazione C++,

Matricola Nome Cognome Aula Fila (dalla cattedra) Posto (dalla porta)

FUNZIONI. Esempi (pseudo-c): dare un nome a una espressione rendere tale espressione parametrica. float f(){ * sin(0.75); } float f1(int x) {

Lezione 6: Funzioni di I/O avanzate

Ingresso ed Uscita in C. Luca Abeni

Introduzione. Costruzione di Interfacce Primi passi in OpenGL. Sierpinski Gasket. Sierpinski gasket. Event driven programming. Stuttura del programma

Operazioni su file di caratteri

Allocazione dinamica della memoria

Primo programma in C

Corso di Informatica 1 (IN110) Tutorato n. 3

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

GerbView. 18 luglio 2018

Esercizio 1 - Soluzione (array)

Esercizio 1: media di numeri reali (uso funzioni e struct)

Introduzione al C. Lez. 2. Funzioni e Puntatori

Informatica B

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

Linguaggio C: le funzioni. Introduzione e sintassi

PROVA SCRITTA DI FONDAMENTI DI INFORMATICA L A 4 DICEMBRE 2003 Prof. Michela Milano COMPITO A

Introduzione al C. Lez. 2 Funzioni e Puntatori

LEZIONE 1 LE BASI DEL LINGUAGGIO C

PILE E CODE. Pile (stack):

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Informatica B

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Le funzioni: dichiarazione, definizione e chiamata Il passaggio degli argomenti per valore e riferimento La funzione main() Le regole di visibilità

Informatica per Statistica Riassunto della lezioni del 14/11/2012 e 16/11/2012

Introduzione alla programmazione in linguaggio C

Proiezione Stereoscopica

Costruiamo un'immagine o qualcosa di simile.

Esercitazione di Reti degli elaboratori

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

Transcript:

Knowledge Aided Engineering Manufacturing and Related Technologies INFORMATICA GRAFICA 5 Maggio Interattività michele.antolini@mail.polimi.it

Input Libreria glut interfaccia con il window system gestione eventi gestione input keyboard/mouse primitive 3D realizza trasparenza rispetto al window system sottostante

Input Input da tastiera glutkeyboardfunc( void (*func)(unsigned int key, int x, int y) Quando viene premuto un tasto ne restituisce il codice ASCII (key) e le coordinate (x,y) del mouse al momento della pressione void key_pressed(int key, int x, int y) { if(key == Q key == q ) exit(0); } Non viene riconosciuto l evento di rilascio del tasto

Input Input da tastiera GLUT definisce tasti speciali in glut.h Tasto F1: GLUT_KEY_F1 Tasto freccia in alto: GLUT_KEY_UP Etc. per F2, DOWN, LEFT... Modificatori: GLUT_ACTIVE_SHIFT GLUT_ACTIVE_CTRL GLUT_ACTIVE_ALT Restituiti dalla glutgetmodifiers() if ( glutgetmodifiers() == GLUT_ACTIVE_SHIFT )...

Input Eventi di input glutmousefunc(void (*func)(int button, int state, int x, int y)) Pressione di un tasto del mouse button può valere GLUT_LEFT_BUTTON GLUT_RIGHT_BUTTON GLUT_MIDDLE_BUTTON state può valere GLUT_UP GLUT_DOWN

Input Eventi di input glutmotionfunc( void (*func)(int x, int y) ) Questa callback viene attivata quando il mouse si muove con uno o più tasti premuti glutpassivemotionfunc( void (*func)(int x, int y) ) Questa callback viene attivata quando il mouse si muove senza tasti premuti

Input Operazioni in background glutidlefunc( void (*func)() ) Questa callback viene attivata quando non avvengono eventi durante l esecuzione del main loop gluttimerfunc (unsigned int msecs, void (*func) (int value), value); esegue la funzione specificata nel secondo parametro dopo almeno msecs millisecondi, passando il valore value viene eseguita solo una volta per ottenere un loop, richiamare la gluttimerfunc alla fine della funzione chiamata!

Input Operazioni in background Ad esempio: void Timer(int extra) { // code... glutpostredisplay(); gluttimerfunc(30,timer,0); } void Timer(int extra) { glutpostredisplay(); gluttimerfunc(30,timer,0); } int main(void) { glutinitdisplaymode(glut_double GLUT_RGB); glutcreatewindow( Window title"); glutdisplayfunc(display); gluttimerfunc(30,timer,0); glmatrixmode(gl_projection); glloadidentity(); glfrustum(-1,1,-1,1,1,3); gltranslated(0,0,-2); glmatrixmode(gl_modelview); glutmainloop(); return 0; }

Input Ridisegno della scena All interno delle callback, se vengono cambiati parametri che influenzano il disegno della scena, è necessario avvertire il motore grafico della necessità di ridisegnarla Per fare ciò, è necessario chiamare la funzione glutpostredisplay();

Double Buffering Ottimizzazione del rendering di una scena Si utilizzano due buffer: front buffer: visualizzato, non modificabile back buffer: modificabile, non visualizzato Alla fine della display() i buffer vengono scambiati Abilitazione double buffer: glutinitdisplaymode( GL_DOUBLE...[altri flag ); Scambio dei buffer alla fine della display(): void Display() { glclear(). /* disegno scena */. glutswapbuffers() }

Sistemi di coordinate I sistemi di coordinate di OpenGL e della finestra sono differenti OpenGL ha (0,0) in alto a sinistra (per la convenzione del refresh dello schermo da sinistra a destra, dall alto in basso) La finestra ha (0,0) in basso a sinistra I parametri y delle callback vanno riassegnati se si vogliono riutilizzare per disegnare tramite OpenGL y_gl = window_width y_win

Picking Disegnando una scena, è possibile dare dei nomi (indici) agli oggetti disegnati Passando alla modalità GL_SELECT è possibile controllare se il mouse è sopra uno degli oggetti (ed ovviamente conoscere quale) All inizio della display, azzerare lo stack dei nomi con glinitnames() Prima di disegnare un oggetto, chiamare glpushname( int name ) Disegnare l oggetto Chiamare glpopname(); Si possono anche innestare Push e Pop per creare gerarchie!

Picking void display() {... glinitnames(); glpushname(0); //si può usare una costante... drawbody(); glpopname(); glpushname(1); drawhead(); draweyes(); glpopname(); drawground(); }...

Picking Una volta dato un nome agli oggetti disegnati, il trucco è il seguente: Date le coordinate del mouse e il viewport attuale, ridisegnamo la scena in modalità GL_SELECT utilizzando un nuovo viewport intorno al cursore (nel nostro esempio, un quadrato 5x5 pixel) Tornando alla modalità GL_RENDER (quella predefinita) OpenGL restituisce il numero di oggetti (con un nome) disegnati Gli oggetti disegnati, sono quelli la cui proiezione appare alle coordinate attuali del mouse

Picking #define BUFSIZE 512 GLuint selectbuf[bufsize];... void startpicking(int cursorx, int cursory) { GLint viewport[4]; glselectbuffer(bufsize,selectbuf); //imposta il buffer per la selezione glgetintegerv(gl_viewport, viewport); //riceve il viewport corrente [x,y,w,h] glrendermode(gl_select); //modalità selezione } glmatrixmode(gl_projection); //modifica della proiezione attuale glpushmatrix(); glloadidentity(); glupickmatrix(cursorx,viewport[3]-cursory, 5, 5, viewport); gluperspective(45,viewport[2]/viewport[3],0.1,1000); glmatrixmode(gl_modelview); display(); //ridisegna la scena (in selection mode) glmatrixmode(gl_projection); glpopmatrix(); //reimposto la matrice in modalità GL_PROJECTION!!!! hits = glrendermode(gl_render); //ora è possibile processare il select buffer...... glmatrixmode(gl_modelview); //reimpostiamo la modalità di disegno

Picking Selection buffer Il numero di hits restituito dalla glrendermode() dice quanti oggetti sono stati effettivamente disegnati L array selectbuf viene riempito in questo modo: N oggetti nella name stack può essere >1 se si usano gerarchie Z minimo Z max Nome (indice) ripetuto se il primo campo > 1

Picking Esempio di selection buffer: hits = 3 0 //è stato disegnato un oggetto, name stack vuoto 10 //z min 2000 //z max 2 //è stato disegnato un oggetto,name stack conteneva 2 valori 2 //z min <- è il valore più basso, l utente vede questo 300 //z max 1 // primo valore nel name stack 2 // secondo valore nel name stack 1 //questa volta la name stack conteneva un solo valore 50 //z min 600 //z max 3 // valore nel name stack

Picking printf("%d hits:\n", hits); for (i = 0; i < hits; i++) printf( "Number: %d\n" "Min Z: %d\n" "Max Z: %d\n" "Name on stack: %d\n", (GLubyte)selecBuf[i * 4], (GLubyte)selectBuf[i * 4 + 1], (GLubyte)selectBuf[i * 4 + 2], (GLubyte)selectBuf[i * 4 + 3] ); printf("\n");