Il mio motore 3D
Durante il tempo libero mi sto dedicando alla realizzazione di un motore 3D per videogame e del relativo editor di livelli.
Per ora supporta le seguenti caratteristiche:
- caricamento della struttura del livello dal disco
- volo con 6 gradi di libertà
- trasparenze e mobilità dell'acqua
- collisioni con le pareti e gli oggetti (fino al test con i triangoli) e, se possibile, scivolamento lungo la loro superficie
- fonti di luce multiple e colorate
- torcia (luce spot e lightmap) costantemente orientata come la vista dell'osservatore
- ghost mode (on/off)
- finestra di dialogo per selezionare il tipo di rendering, la modalità a finestra (ridimensionabile) o a schermo pieno, le sfumature flat o gouraud, il filtro bilineare, il dithering, ecc.
- visione stereoscopica (utilizzando i famosi occhiali con una lente rossa e una blu)
- nebbie volumetriche di zona (gli esempi che seguono sono tutti realizzati con lo stesso bitmap)
- luci/nebbie/esplosioni volumetriche sferiche (6 tipi)
- illuminazione statica a scelta tra calcolo sui vertici e uso delle lightmap (comprese ombre statiche e animate per il lampeggiamento delle luci o per l'aprirsi delle porte)
- bump map statico o dinamico (semiprocedurale) per superfici corrugate e acqua
- bump map + environment map
- richiede DirectX 7.0 per funzionare
Ho sviluppato il programma per Windows 9x e le DirectX, in modo da poter sfruttare agevolmente le schede accellerate per il 3D.
Le foto che seguono mostrano alcune delle potenzialità attuali del gioco.
I bitmap utilizzati per le texture sono, per il momento, o presi in prestito dallo splendido gioco "Jedi Knight" della Lucas Arts o sono stati realizzati da un mio studente. Alcune non sono allineate bene perché l'editor è ancora molto incompleto.
Una schermata del vecchio editor di mondi e oggetti 3D.
Alcune finestre del nuovo editor di mondi, oggetti e animazioni.
(Clicca sull'immagine per ingrandirla)
Finestra di dialogo con le impostazioni delle opzioni grafiche.
Messaggio con la descrizione del driver selezionato.
Uno scorcio del mondo 3D che mette in evidenza la trasparenza dell'acqua.
Primo algoritmo per la visione stereoscopica.
Secondo algoritmo per la visione stereoscopica (più definita ma anche più scura).
Nebbia volumetrica.
Nebbia volumetrica subacquea e nel corridoio in superficie.
LightMap per la torcia (1).
LightMap per la torcia (2).
Luce volumetrica sferica (1).
Luce volumetrica sferica (2).
Nebbia volumetrica sferica (1).
Nebbia volumetrica sferica (2).
Nebbia volumetrica sferica (3).
Nebbia volumetrica sferica con sfumature di colore.
Nebbia volumetrica sferica scura (1).
Nebbia volumetrica sferica scura (2).
Luci e ombre tramite lightmap precalcolati (6 fonti di luce nella stanza).
Onde e vortice dinamici in acqua tramite bump-map.
Caratteristiche che saranno implementate in un prossimo, o remoto, futuro (pił o meno in ordine):
- environment maps
- effetti di illuminazione dinamica tramite lightmap
- ombre dinamiche di oggetti in movimento
- visione distorta dinamicamente sotta la superficie dell'acqua (forse)
- specchi semplici e complessi (area posteriore visibile)
- gestione delle zone (e dei portali) per una prima ottimizzazione dei FPS -> editor
- lens flare
- oggetti e personaggi animati, IA, interattivitą, fisica, il tutto in una DLL a parte
- suono 3D
- possibilitą di giocare in rete
- funzioni load/save
- salvataggio della configurazione nel registro di Windows
- "particle emitter" per fuoco e fumo
- esterni con terreni voxel approssimati da triangoli
- cielo dinamico multistrato, sole, luna ecc.
- superfici curve
- LOD (quantizzato o continuo?) dei personaggi e delle superfici curve in funzione della loro distanza dalla telecamera e delle impostazioni scelte dall'utente
- interazione totale con qualunque oggetto o superficie
- ottimizzazione dei FPS