Calcolo numerico per la generazione di immagini fotorealistiche

A.A. 2020/2021
6
Crediti massimi
62
Ore totali
SSD
FIS/05 FIS/06
Lingua
Italiano
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
Risultati apprendimento attesi
Lo studente al termine del corso 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 (nel corso 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 (nel corso verrà usato GitHub);
7. Sarà in grado di usare strumenti per la misura delle performance di codice (perf, valgrind, etc.).
Programma e organizzazione didattica

Edizione unica

Responsabile
Periodo
Secondo semestre
L'insegnamento potrà essere erogato interamente da remoto, se vi fossero limitazioni alla mobilità legate all'emergenza sanitaria. In tal caso le lezioni di teoria saranno fornite in modalità asincrona, per facilitarne lo scaricamento delle lezioni video e la loro fruizione anche per quegli studenti con connessioni internet deboli; le lezioni di laboratorio, per comprensibili motivi, saranno svolte invece in modalità sincrona. Gli studenti potranno usare la piattaforma Ariel per rivolgere domande al docente in qualsiasi momento, soprattutto per eventuali lezioni in modalità asincrona.

I materiali di riferimento non subiranno in alcun caso variazioni.

Se sarà necessario tenere esami a distanza, questi saranno svolti usando una delle due piattaforme Zoom o Jitsi Meet, a seconda della situazione e delle disponibilità
Programma
Il programma comprende i seguenti argomenti (lezioni teoriche):

- Equazione del rendering
- Spazi di colore
- Codifica di immagini e video
- Elementi di geometria tridimensionale
- Codifica geometrica di oggetti complessi
- Algoritmo di ray tracing
- Global illumination
- Metodi Monte Carlo
- Filtering e shading

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_
- Utilizzo di strumenti per la misura di performance del codice
- Adozione di sistemi di Continuous Integration (CI)
- Uso di Pull Requests e di code reviews
- Modalità di attribuzione dei numeri di versione
Prerequisiti
Il corso è rivolto principalmente a studenti delle lauree magistrali in Fisica e in _Physics of Data_.

È richiesta la conoscenza di almeno un linguaggio di programmazione, quale ad esempio: C, C++, D, Objective-C, Pascal, Julia, etc. Lo studente ha la libertà di scegliere il linguaggio che preferisce per l'implementazione del software che verrà richiesto durante il corso. 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 corso; in ogni caso, il docente richiederà all'inizio del corso 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
Il corso è articolato in lezioni frontali e lezioni di laboratorio, la cui partecipazione è obbligatoria. Ogni settimana si tiene una lezione di teoria, della durata di due ore, e una lezione di laboratorio, della durata di due-tre ore, per un totale di circa 12 settimane (6 CFU: 14 ore di lezioni teoriche più 48 ore di laboratorio).

A seconda della disponibilità, le esercitazioni possono tenersi nel laboratorio di informatica, oppure in un'aula sprovvista di calcolatori; in ogni caso, è fortemente consigliato che ogni studente si presenti col proprio calcolatore portatile. Per quegli studenti che ne fossero provvisti, il docente può, nei limiti del possibile, fornire dei portatili in prestito per il tempo della lezione.

La tendenza sarà quella di illustrare nella lezione di teoria un nuovo problema matematico, che verrà poi affrontato nella lezione di laboratorio. Durante ogni lezione di laboratorio gli studenti dovranno imbastire l'implementazione del nuovo codice all'interno del software già sviluppato nelle lezioni precedenti. Il lavoro deve essere svolto in gruppi di 2-4 persone, e usando `git` e il sito GitHub.

Dal momento che uno dei contenuti fondamentali del corso è il corretto uso di sistemi di controllo di versione, è richiesto che ogni studente svolga gli esercizi assegnati durante la lezione di teoria entro la lezione di laboratorio della _settimana successiva_, a meno di indicazione contraria.

Durante le lezioni di laboratorio, il docente assiste gli studenti e, a seconda dei linguaggi/strumenti scelti da ogni gruppo, suggerisce metodi per raggiungere nel modo più corretto possibile l'obbiettivo della lezione.
Materiale di riferimento
- Suffern, _Ray-tracing from the ground-up_ (2007),
[www.raytracegroundup.com](http://www.raytracegroundup.com);
- Pharr, Jakob, Humphreys, _Physically based rendering: from theory to
implementation_ (2004), [www.pbrt.org/](https://www.pbrt.org/);
- Dutré, Bekaert, Bala, _Advanced global illumination_ (2006),
[sites.edm.uhasselt.be/agibook/](http://sites.edm.uhasselt.be/agibook/);
- Shirley, _Ray tracing in one week end_ book series,
[raytracing.github.io/](https://raytracing.github.io/);
- McQuaid, _Git in practice_ (Manning, 2015),
[www.manning.com/books/git-in-practice](https://www.manning.com/books/git-in-practice);
- Chacon, Straub, _Pro Git_, [git-scm.com/book/en/v2](https://git-scm.com/book/en/v2);
Modalità di verifica dell’apprendimento e criteri di valutazione
L'esame finale consiste nella presentazione _individuale_ del software al docente e agli altri studenti del corso, e a una interrogazione orale sui contenuti teorici del corso. Non è previsto un esame scritto. L'esito è un voto espresso in trentesimi, che tiene conto anche 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 del corso: 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 il corso sono
state indicate come facoltative permetterà agli studenti di
aumentare il proprio punteggio.
FIS/05 - ASTRONOMIA E ASTROFISICA - CFU: 0
FIS/06 - FISICA PER IL SISTEMA TERRA E PER IL MEZZO CIRCUMTERRESTRE - CFU: 0
Laboratori: 48 ore
Lezioni: 14 ore
Docente: Tomasi Maurizio
Docente/i
Ricevimento:
Su appuntamento
Laboratorio di Strumentazione Spaziale, Dipartimento di Fisica (via Celoria 16, Milano)