Amazing Skies un simulatore spaziale sviluppato da zero in C++ e GLSL
"Non reinventare la ruota, a meno che tu non abbia intenzione di saperne di più sulle ruote."
Questo programma è una tech demo di un simulatore spaziale. L'ho sviluppato interamente da solo, nel tempo libero, da zero e senza usare alcuna libreria esterna, in C++ e GLSL, per approfondire le mie conoscenze di computer graphics e engine 3D.
Il nome Amazing Skies vuole essere un omaggio ad Amazing Stories, la storica rivista fantascientifica statunitense, ed è stato ispirato da un collage di screenshot che ho realizzato e utilizzato come splash screen.
Modelli e texture
I modelli 3D sono stati anch'essi creati da zero utilizzando Blender, in modo molto rudimentale per la verità, non essendo il mio obiettivo approfondire le tecniche di modellazione 3D. Anche le texture per gli interni e gli esterni delle astronavi vengono tutte da foto manipolate allo scopo (una foto di un container, di un camion frigorifero, di un'ala di un aereo, eccetera). Tutti questi "contenuti" devono essere considerati nulla più di placeholder per testare l'engine 3D.
L'editor che ho creato per preparare i miei oggetti importa i modelli esportati da Blender in formato Wavefront OBJ e le texture in formato BMP, per poi esportare il tutto in un formato proprietario ottimizzato e pronto per essere utilizzato dal programma. Il programma supporta il diffuse mapping (le texture tradizionali), il bump mapping o il normal mapping (per i rilievi dei materiali), lo specular mapping (per i riflessi) e l'ambient occlusion (che da una prima approssimazione dell'occlusione rispetto all'illuminazione ambientale).
Ho implementato un sistema LOD (level of detail) che permette di associare più di una mesh per ogni oggetto e utilizzare quella più opportuna in base alla dimensione a schermo.
Procedurale
Per quanto riguarda i pianeti e lune invece, essi vengono generati in base alla posizione della camera una volta al secondo utilizzando un thread apposito per ogni corpo celeste. È stato molto interessante ed istruttivo inventare un algoritmo efficiente per la generazione di una sfera opportunamente suddivisa e deformata in base alla morfologia del pianeta.
I contenuti generati proceduralmente, come le nebulose, le atmosfere e gli anelli dei giganti gassosi, le coste e le montagne dei pianeti rocciosi, sono ottenuti con un'implementazione in GLSL di un algoritmo per la generazione di rumore pseudo casuale.
Realistico e immersivo
Una delle caratteristiche principali che volevo ottenere fin dall'inizio è la transizione atmosfera - spazio senza interruzioni e caricamenti, per poter esplorare i sistemi stellari nel modo più realistico possibile. Le dimensioni e le distanze di stelle e pianeti sono realistici e modellati a partire dai dati del nostro sistema solare.
Un'altra caratteristica presente fin dalle prime fasi di sviluppo, retaggio dal simulatore spaziale 2D da cui Amazing Skies è nato (vedi Inertia), è la possibilità di attraccare e spostarsi a piedi da una nave/stazione all'altra, grazie alla presenza di boccaporti standard in tutte le navi e le stazioni spaziali.
Rappresentazione delle rotazioni tridimensionali
Per rappresentare le rotazioni tridimensionali ho implementato i calcoli, oltre che con le classiche matrici, con i quaternioni (l'analogo dei numeri complessi con $3$ unità immaginarie $i^2 = j^2 = k^2 = -1$).
Questa rappresentazione è possibile in quanto i quaternioni unitari formano un'ipersfera quadridimensionale $S^3$ in $\mathbb{R}^4$ e a ogni coppia di punti $q$ e $-q$, opposti rispetto al centro dell'ipersfera, si può associare una rotazione tridimensionale $x \mapsto q \, x \, q^{-1}$ dove $x = (0, v)$ con $v \in \mathbb{R}^3$.
La rappresentazione delle rotazioni tridimensionali attravero i quaternioni è computazionalmente più efficiente, evita alcuni problemi (vedi gimbal lock) e permette di manipolare le rotazioni in modo più semplice e naturale, come nel caso dello slerp (spherical linear interpolation), che utilizzo per ruotare in modo naturale la "telecamera".