Calcolo numerico per la generazione di immagini fotorealistiche
A.A. 2024/2025
Obiettivi formativi
L'insegnamento vuole fornire agli studenti due tipi di competenze: la capacità di implementare un codice numerico che approssimi un modello di un fenomeno fisico non banale, e l'abilità nel costruire un software complesso, usando una serie di strumenti di livello professionale come supporto alla programmazione.
La prima competenza consiste nell'acquisire la capacità di implementare un software che calcoli soluzioni via via più accurate della cosiddetta equazione del rendering, generando immagini fotorealistiche a partire da un modello matematico che descriva la morfologia di oggetti tridimensionali in modo simile a quello di programmi come Autodesk 3D Studio.
Il secondo genere di competenza sviluppato in questo insegnamento permetterà allo studente di costruire un software complesso, formato da più parti in interazione tra loro e da una robusta serie di verifiche interne. Per realizzare questo scopo, lo studente saprà usare strumenti e procedure usate oggi sia in ambito scientifico che civile per lo sviluppo di software professionali, quali: misura delle performance di programmi (in termini sia di tempo che di occupazione di memoria), sistemi di controllo di versione, sistemi di bug-tracking, tecniche di unit testing ed integration testing, servizi di Continuous Integration (CI), etc
La prima competenza consiste nell'acquisire la capacità di implementare un software che calcoli soluzioni via via più accurate della cosiddetta equazione del rendering, generando immagini fotorealistiche a partire da un modello matematico che descriva la morfologia di oggetti tridimensionali in modo simile a quello di programmi come Autodesk 3D Studio.
Il secondo genere di competenza sviluppato in questo insegnamento permetterà allo studente di costruire un software complesso, formato da più parti in interazione tra loro e da una robusta serie di verifiche interne. Per realizzare questo scopo, lo studente saprà usare strumenti e procedure usate oggi sia in ambito scientifico che civile per lo sviluppo di software professionali, quali: misura delle performance di programmi (in termini sia di tempo che di occupazione di memoria), sistemi di controllo di versione, sistemi di bug-tracking, tecniche di unit testing ed integration testing, servizi di Continuous Integration (CI), etc
Risultati apprendimento attesi
Lo studente al termine dell'insegnamento avrà acquisito le seguenti abilità:
1. Sarà in grado di implementare un software complesso che simuli un sistema descritto da un modello fisico non banale;
2. Saprà come descrivere matematicamente la morfologia di oggetti tridimensionali complessi;
3. Saprà come usare trasformazioni omogenee e quaternioni per descrivere la collocazione e l'orientamento di oggetti nello spazio tridimensionale;
4. Saprà collaborare con altre persone nello sviluppo di software usando un software di controllo di versione distribuito (nell'insegnamento verrà usato git) e sistemi di code review;
5. Avrà la capacità di gestire sistemi di bug-tracking per tenere sotto controllo la qualità del proprio software;
6. Saprà utilizzare web-platform per la gestione e la condivisione di codice (nell'insegnamento verrà usato GitHub);
7. Sarà in grado di usare strumenti per la misura delle performance di codice (perf, valgrind, etc.).
1. Sarà in grado di implementare un software complesso che simuli un sistema descritto da un modello fisico non banale;
2. Saprà come descrivere matematicamente la morfologia di oggetti tridimensionali complessi;
3. Saprà come usare trasformazioni omogenee e quaternioni per descrivere la collocazione e l'orientamento di oggetti nello spazio tridimensionale;
4. Saprà collaborare con altre persone nello sviluppo di software usando un software di controllo di versione distribuito (nell'insegnamento verrà usato git) e sistemi di code review;
5. Avrà la capacità di gestire sistemi di bug-tracking per tenere sotto controllo la qualità del proprio software;
6. Saprà utilizzare web-platform per la gestione e la condivisione di codice (nell'insegnamento verrà usato GitHub);
7. Sarà in grado di usare strumenti per la misura delle performance di codice (perf, valgrind, etc.).
Periodo: Secondo semestre
Modalità di valutazione: Esame
Giudizio di valutazione: voto verbalizzato in trentesimi
Corso singolo
Questo insegnamento può essere seguito come corso singolo.
Programma e organizzazione didattica
Edizione unica
Responsabile
Periodo
Secondo semestre
Programma
Il programma comprende i seguenti argomenti (lezioni teoriche):
- Equazione del rendering
- Spazi di colore
- Codifica di immagini
- Elementi di geometria tridimensionale
- Codifica geometrica di oggetti complessi
- Algoritmo di ray tracing
- Global illumination
- Metodi Monte Carlo
- Teoria dei compilatori
Nelle lezioni di laboratorio, oltre all'implementazione di formule spiegate durante le lezioni di teoria, si affrontano i seguenti argomenti:
- Uso di sistemi di controllo di versione
- Uso di sistemi di _bug tracking_
- Adozione di sistemi di Continuous Integration (CI)
- Uso di Pull Requests e di code reviews
- Modalità di attribuzione dei numeri di versione
- Equazione del rendering
- Spazi di colore
- Codifica di immagini
- Elementi di geometria tridimensionale
- Codifica geometrica di oggetti complessi
- Algoritmo di ray tracing
- Global illumination
- Metodi Monte Carlo
- Teoria dei compilatori
Nelle lezioni di laboratorio, oltre all'implementazione di formule spiegate durante le lezioni di teoria, si affrontano i seguenti argomenti:
- Uso di sistemi di controllo di versione
- Uso di sistemi di _bug tracking_
- Adozione di sistemi di Continuous Integration (CI)
- Uso di Pull Requests e di code reviews
- Modalità di attribuzione dei numeri di versione
Prerequisiti
L'insegnamento è rivolto a studenti delle lauree magistrali in Fisica e in Physics of Data; non è invece indicato per studenti della laurea triennale.
È richiesta la conoscenza di almeno un linguaggio di programmazione, quale ad esempio: C, C++, Fortran, Pascal, Julia, etc. Lo studente ha la libertà di scegliere il linguaggio che preferisce per l'implementazione del software che verrà richiesto durante le lezioni. Per esigenze legate ai sistemi usati dal docente per verificare il funzionamento dei programmi degli studenti, i codici sviluppati dovranno essere eseguibili su sistemi Linux a 64 bit; non è ovviamente vietato né sconsigliato che tali codici possano funzionare anche su altre piattaforme.
Alcuni linguaggi, come Fortran o Python, non sono adatti per lo sviluppo del software prodotto durante questo insegnamento; in ogni caso, il docente richiederà all'inizio delle lezioni di discutere con lui il linguaggio scelto.
Propedeuticità richieste:
- Analisi matematica 1;
- Analisi matematica 2;
- Analisi matematica 3;
- Geometria 1;
- Informatica;
- Laboratorio di trattamento numerico dei dati sperimentali.
È richiesta la conoscenza di almeno un linguaggio di programmazione, quale ad esempio: C, C++, Fortran, Pascal, Julia, etc. Lo studente ha la libertà di scegliere il linguaggio che preferisce per l'implementazione del software che verrà richiesto durante le lezioni. Per esigenze legate ai sistemi usati dal docente per verificare il funzionamento dei programmi degli studenti, i codici sviluppati dovranno essere eseguibili su sistemi Linux a 64 bit; non è ovviamente vietato né sconsigliato che tali codici possano funzionare anche su altre piattaforme.
Alcuni linguaggi, come Fortran o Python, non sono adatti per lo sviluppo del software prodotto durante questo insegnamento; in ogni caso, il docente richiederà all'inizio delle lezioni di discutere con lui il linguaggio scelto.
Propedeuticità richieste:
- Analisi matematica 1;
- Analisi matematica 2;
- Analisi matematica 3;
- Geometria 1;
- Informatica;
- Laboratorio di trattamento numerico dei dati sperimentali.
Metodi didattici
L'insegnamento è articolato in lezioni frontali e lezioni di laboratorio; per queste ultime, la partecipazione è obbligatoria. Ogni settimana si tiene una lezione di teoria, della durata di due ore e che viene solitamente videoregistrata e messa a disposizione degli studenti, e una lezione di laboratorio, della durata di due-tre ore e la cui presenza è obbligatoria, per un totale di 13 settimane.
Materiale di riferimento
- Suffern, Ray-tracing from the ground-up (2007), https://books.google.it/books?id=ggJ-DwAAQBAJ
- Pharr, Jakob, Humphreys, Physically based rendering: from theory to implementation (2004), https://www.pbrt.org/
- Dutré, Bekaert, Bala, Advanced global illumination (2006), http://sites.edm.uhasselt.be/agibook/
- Shirley, Ray tracing in one week end book series, https://raytracing.github.io/
- McQuaid, Git in practice (Manning, 2015), https://www.manning.com/books/git-in-practice
- Chacon, Straub, Pro Git, https://git-scm.com/book/en/v2
Sito Ariel del corso.
- Pharr, Jakob, Humphreys, Physically based rendering: from theory to implementation (2004), https://www.pbrt.org/
- Dutré, Bekaert, Bala, Advanced global illumination (2006), http://sites.edm.uhasselt.be/agibook/
- Shirley, Ray tracing in one week end book series, https://raytracing.github.io/
- McQuaid, Git in practice (Manning, 2015), https://www.manning.com/books/git-in-practice
- Chacon, Straub, Pro Git, https://git-scm.com/book/en/v2
Sito Ariel del corso.
Modalità di verifica dell’apprendimento e criteri di valutazione
L'esame finale consiste nella presentazione *individuale* del software sviluppato durante il semestre al docente e agli altri studenti dell'insegnamento, e a una interrogazione orale sui contenuti teorici delle lezioni. Non è previsto un esame scritto. L'esito è un voto espresso in trentesimi, che tiene conto anche della qualità del lavoro svolto settimanalmente durante le ore di laboratorio.
Le competenze che verranno esaminate durante l'esame finale sono le seguenti:
- Conoscenza dei contenuti teorici dell'insegnamento: geometria, equazione del rendering, filtering, shading, metodi Monte Carlo, etc.;
- Capacità di ragionare criticamente sul progetto che è stato realizzato;
- Accuratezza e pulizia del codice;
- Correttezza nell'uso del software di controllo di versione;
- Presentazione della pagina GitHub del progetto presentato e della
sua documentazione;
- Qualità dell'esposizione;
- La presenza di funzionalità del codice che durante le lezioni sono state indicate come facoltative permetterà agli studenti di aumentare il proprio punteggio.
Le competenze che verranno esaminate durante l'esame finale sono le seguenti:
- Conoscenza dei contenuti teorici dell'insegnamento: geometria, equazione del rendering, filtering, shading, metodi Monte Carlo, etc.;
- Capacità di ragionare criticamente sul progetto che è stato realizzato;
- Accuratezza e pulizia del codice;
- Correttezza nell'uso del software di controllo di versione;
- Presentazione della pagina GitHub del progetto presentato e della
sua documentazione;
- Qualità dell'esposizione;
- La presenza di funzionalità del codice che durante le lezioni sono state indicate come facoltative permetterà agli studenti di aumentare il proprio punteggio.
FIS/05 - ASTRONOMIA E ASTROFISICA - CFU: 3
FIS/06 - FISICA PER IL SISTEMA TERRA E PER IL MEZZO CIRCUMTERRESTRE - CFU: 3
FIS/06 - FISICA PER IL SISTEMA TERRA E PER IL MEZZO CIRCUMTERRESTRE - CFU: 3
Laboratori: 48 ore
Lezioni: 14 ore
Lezioni: 14 ore
Docente:
Tomasi Maurizio
Docente/i
Ricevimento:
Su appuntamento
Laboratorio di Strumentazione Spaziale, Dipartimento di Fisica (via Celoria 16, Milano)