Making of “Appartamento” – UE4

pubblicato in: Making of, UE4 | 0

 

Una breve premessa riguardante Unreal Engine. L’ambito del programma è esclusivamente videoludico, è stato sviluppato nel corso degli anni proprio per tal funzione. Con le ultime release il software ha implementato l’utilizzo degli shader PBR (physically based rendering) ed è stato integrato l’enlighten (un sistema di illuminazione globale in realtime), guadagnando in tal maniera un notevole miglioramento riguardo la resa.
Il programma non permette di modellare oggetti 3d complessi, ha la possibilità di realizzare delle semplici primitive 3d e modificarle, ed aggiungo per nulla utili. Le geometrie debbono quindi e comunque essere modellate tramite altri software, qualsiasi essi siano, ed esportate in formato .fbx
Ne consegue che il suo utilizzo può essere solo d’ausilio proprio allo sviluppo dei rendering, animazioni, walktrough e visite interattive. Praticamente tutto il progetto dovrebbe essere bello che pronto (almeno cosi’ io ho agito) e quindi importato all’interno del programma, anche per meglio ottimizzarne i tempi di sviluppo.
Infine, se paragonati ai rendering realizzati con i classici programmi tradizionali come V-Ray, mental ray, Iray etc, le immagini derivanti da Unreal saranno decisamente inferiori in termini di pura resa grafica e accuratezza, ma lo sviluppo di un progetto tramite il software, offre in molti casi dei vantaggi che a mio parere e specialmente nel campo dei rendering architettonici, vanno meglio a comunicare il progetto stesso, acquistando anche a volte, più importanza del fotorealismo.

 

PREPARAZIONE ALL’ESPORTAZIONE
Nello sviluppo del progetto ho avuto modo di organizzare tutti gli oggetti presenti nella scena singolarmente, ho disposto il tutto in maniera tale da poter selezionare ed ispezionare ogni geometria presente nel progetto. Disponevo quindi ad esempio, della pavimentazione, muri, arredi, complementi etc., quindi nessun gruppo e/o insiemi di oggetti uniti.

5

Inoltre le geometrie sono state ottimizzate sia in termini di numero vertici (ho ridotto considerevolmente il numero di loop nella quasi totalità delle mesh, definendone al minimo necessario, nel caso di oggetti poligonali suddivisi, il numero di iterazioni, questo per rendere più agevole la visualizzazione all’interno di Unreal) che di UV map.

Queste ultime sono state riviste in funzione delle impostazioni che Unreal richiede. Praticamente la necessità che il software impone è quella riguardante la creazione di due UV. La prima, fondamentale, riguarda l’uso per le connessioni agli shader, quindi le texture di diffusione, riflessione, bump etc. La seconda che è altrettanto importante interessa la mappa dell’illuminazione. In concreto il software genera sulla seconda UV il baking dell’illuminazione, cosi le ombre e le luci vengono proiettate sulle stesse UV. Se queste ultime non sono sviluppate con criterio, la qualità e definizione dell’illuminazione all’interno del software verrà a mancare. E’ possibile anche lasciare questo compito alla gestione automatica del programma, ma l’accuratezza delle UV nella maggior parte dei casi è scadente. Comunque su questo punto approfondirò meglio nella seconda parte, cosi come sulla illuminazione globale, in quanto le due cose sono intrinsecamente legate.

Altra specifica che bisogna attenzionare prima dell’esportazione è quella riguardante il pivot degli oggetti e la loro collocazione nello spazio 3D. In generale ho suddiviso le geometrie in due categorie, quelle che necessitavo rimanessero “ferme” nello spazio (in modo da averne l’esatta corrispondenza e aggancio durante l’importazione es. pavimento, solai, muri) rispetto alle altre, come gli arredi e i complementi, di cui mi riservavo la possibilità di traslarle a mio piacimento e di ottimizzarle singolarmente in funzione di alcuni aspetti su Unreal.
La collocazione dei muri, pavimentazione e solai era quella che avevo già impostato, assegnando però al pivot le coordinate 0,0,0.
Per tutti gli altri oggetti invece ho collocato sia il loro posizionamento che il pivot a 0,0,0

Altro punto essenziale è quello che riguarda la suddivisione degli id. Unreal essenzialmente riesce ad interpretare le geometrie con dei sotto elementi e/o delle selezioni di differenti poligoni, sempre della stessa mesh. Questo torna utilissimo nel caso di singole geometrie con selezioni di diversi materiali al loro interno, come ad esempio il pavimento (unica geometria) che disponeva di 3 tipologie di finiture differenti. L’unica specifica quando si ha a che fare con questi oggetti, è quella di assegnare tante quante tipologie di materiali si intende sfruttare sui rispettivi id. In tal maniera Unreal riesce a tenerne conto e prepara la mesh a distinti input di materiali.

Riguardo il sistema metrico conviene utilizzare i cm., in quanto è quello che Unreal considera corretto.
Una volta che quanto sopra è stato attenzionato si può procedere all’esportazione in formato .FBX. Queste sono le specifiche ho utilizzato.

6

Caricato il programma basta creare una scena pulita senza bisogno di inserire gli asset che il programma propone. Fatto questo ho importato le singole geometrie con questi parametri

7

La prima cosa dopo aver caricato tutte le mesh è stata quella di collocare queste ultime nello spazio 3d. Una volta importate basta resettarne le coordinate su 0,0,0. Cosi facendo il programma tiene conto dei valori del pivot per come sono stati precedentemente impostati e le posiziona correttamente.

Setup scena, illuminazione, uv e materiali
Un’aspetto puramente organizzativo ma da attenzionare nella fase preparatoria della scena credo che sia quello riguardante la predisposizione delle directory. Categorizzare con criterio tutti gli asset presenti nella scena, vi permetterà di ottimizzare il workflow, in funzione del fatto che in breve tempo (relativamente alla complessità della scena) potreste avere a che fare con delle liste infinite di elementi.
L’individuazione e la conseguente ispezione degli asset tramite la viewport a volte non è propriamente agevole quindi meglio disporre il tutto in delle directory con nomi immediatamente identificabili e per categoria in modo da renderne agevole la scelta, sia nel Content browers che nel World Outliner (due finestre che elencano gli oggetti presenti nella scena e tutti gli asset disponibili). Vi consiglio di creare almeno 4 directory nel Content: 1.Fbx (le geometrie importate); 2.Texture (immagini inerenti agli shader); 3.Material (shader veri e propri); Maps (dove verranno conservati tutti i livelli del gioco).

Quindi, dopo aver esportato tutte le geometrie ho assemblato e ricreato la scena come dalle immagine in allegato.

8 9

Conseguentemente a questo ho provveduto ad inserire due volumi, il Lightmass Importance Volume ed il Post process volume. Rispettivamente, il primo serve a definire i limiti spaziali entro i quali meglio si circoscrive l’area che necessità di migliore definizione per l’illuminazione globale. La seconda riguarda una serie di controlli sui colori, sulla esposizione, profondità di campo etc, che tornano molto utili in fase di finalizzazione del progetto.

10

Ora, riguardo la gestione dell’illuminazione, vi faccio qualche appunto su come viene gestita dal software, prima di procedere nel setup che ho utilizzato. Tutta la “magia” dell’illuminazione globale in realtime, viene gestita dal software tramite un precalcolo; il conseguente baking sulle mesh (proiezione delle ombre/luci sulle uv) permette di poter interagire e quindi apprezzare tutto il progetto in tempo reale. Cosi messa sembra poca roba, ma vi assicuro che poter navigare all’interno del game in realtime con una qualità grafica di tutto rispetto, azzerando di fatto tutti i tempi di calcolo dediti allo sviluppo dei rendering col classico workflow (non nella fase del precalcolo, che può essere più o meno lunga relativamente alla complessità della scena), a mio avviso è una vera e propria rivoluzione!!!

L’illuminazione indiretta viene gestita tramite dei parametri che ne definiscono l’accuratezza. Non avviene un vero e proprio calcolo in tempo reale, quello è propriamente legato a delle tecniche/software ancora sperimentali ad es. VXGI della Invidia.
L’attivazione e l’utilizzo dell’illuminazione globale, avviene inserendo all’interno della scena una tipologia di luci che vengono definite “statiche o stazionarie”. Praticamente solo quest’ultime acconsentono all’emissione dei photon, indispensabili per simulare il rimbalzi e quindi la luce indiretta. L’altra tipologia di illuminazione è definita dall’uso della luce dinamica, legata di per sé alla luce movibile e alla quale non è permessa l’emissione dei photon e quindi la sua l’implementazione.
I parametri che influiscono alla definizione della GI, sono quelli che hanno a che fare con il Lightmass e le Lightmap, termini da tenere in considerazione in molte delle specifiche su Unreal, in primis nella definizione delle uv. Come indicavo precedentemente, il baking viene proiettato sul secondo canale. Le specifiche più importanti riguardano lo spazio adeguato che bisogna dare alle selezioni di poligoni/elementi della mesh. Nel caso di semplici geometrie, il tutto avviene in maniera molto agevole, ad esempio come nei muri perimetrali del mio progetto. In tal caso ho effettuato un unwarp automatico (il flatten mapping la maggior parte dei casi va bene), per poi però unirne i vari spigoli in maniera tale da disporre le varie pareti in diverse estensioni. Inoltre cercare di allocare più spazio possibile ai poligoni che saranno osservati nel progetto è un’altra specifica da valutare. Ad es. ho rimpicciolito la selezione esterna dei muri, per ricavare più spazio da assegnare a quelli che sarebbero stati oggetto di visualizzazione nel game.

11

In funzione di oggetti poco più complessi, come ad es. la sedia, la gestione potrebbe divenire articolata. La conoscenza delle tecniche di unwrap tornano utilissime, in quanto, una discreta quantità di tempo potrebbe essere spesa nella corretta proiezione delle geometrie, in funzione di una migliore accuratezza/definizione delle luce/ombre sulle stesse. La collocazione e  l’inserimento di tagli nelle zone non visibili (tecniche di pelt), diventano a volte indispensabili.

12

Infine per chiudere questa premessa, un parametro che bisogna considerare e riguardante le geometrie è quello della Min light map resolution. Questo regola la precisione della uv. Più alto è il valore, migliore e’ l’accuratezza della uv map. Questo numero ho avuto modo di correggerlo in base alla definizione che intendevo raggiungere e il range è stato tra 64 ed 1024; quest’ultimo l’ho utilizzato per le pareti/solaio/pavimento in quanto li si andava a proiettare la maggior parte delle ombreggiature. Il software ipotizza che l’uv sia proiettata su una scacchiera ed il valore ne gestisce il numero delle suddivisioni. Per alcune geometrie ho propriamente realizzato una texture apposita ed utilizzandone i pixel, ho meglio agganciato le uv (vertici proiettati della mesh) ai riquadri, per avere ancora un’ulteriore esattezza nel precalcolo dell’illuminazione.

Il setup delle luci che ho seguito è stato creato per colmare ed aggirare alcuni limiti tecnici propri del programma, anche perchè a conti fatti, qua si sta cercando di adeguare un software che non è certo nato per realizzare rendering fotorealistici. Lo sviluppo da parte della Epic è continuo ed in ogni release il programma è più ottimizzato, ma naturalmente i miglioramenti riguardano principalmente il fine per cui è stato creato, giochi e applicazioni. Ho anche avuto modo di constatare che il calcolo della GI è accurato fino ad un certo punto e per cercare di rendere il tutto più simile ai rendering che realizzai qualche tempo addietro ho dovuto inserire e sperimentare delle tecniche che sono andate possibilmente a discapito del realismo, ma che comunque mi hanno permesso di meglio definire le ombre/luci.

Il setup delle luci che ho utilizzato e’ il seguente:

– 1 luce per simulare il sole (Directional Light), i conseguenti rimbalzi hanno dato un’illuminazione diffusa. Modalità stazionaria
– 3 spot in prossimità delle finestre per simulare l’illuminazione proveniente dall’esterno e che proiettano su dei piani per ricavarne dei rimbalzi. Modalità statica
– 3 spot per proiettare delle ombre più definite negli oggetti nelle vicinanze delle finestre attivando il Distance Field Shadows. Modalità movibile

13 15

La creazione degli shader è stata sicuramente quella che mi ha occupato più tempo. Il tutto viene gestito tramite l’uso di nodi. A prima vista può sembrare abbastanza semplice, ma per riuscire a simulare al meglio alcune specifiche, (riscontrandone anche i limiti di Unreal), bisogna comprenderne alcuni parametri che non sono del tutto immediati. Vi allego il setup dello shader del divano e del tavolo in legno ed un’oggetto di esempio per evidenziarne gli ID assegnati.

16 17 18

Una volta che tutte geometrie sono state importate, gli shader e le luci inserite, si possono iniziare a fare dei test sull’illuminazione. Naturalmente le varie simulazioni sono state realizzate man man che interagivo con gli asset presenti e nel prosieguo, ne ho affinato sempre più i valori e definito meglio il tono generale. Il software permette di gestire vari gradi di accuratezza della GI tramite alcuni valori all’interno del lightmass volume. I parametri su cui è possibile intervenire sono ben pochi e permettono in un tempo relativamente breve (nella proprietà precalcolo impostata a medium) di raggiungere un discreto livello qualitativo. Sarebbe anche possibile, per ancor meglio definire l’accuratezza e la qualità, modificare il file .ini, ma non ne ho trovato la necessità, almeno per questa demo.
Questi sono i parametri del lightmass che ho utilizzato.

19

Proprio in questa fase, ho accertato anche la bontà della realizzazione delle uv map che in alcuni casi ho dovuto riprenderle e ottimizzare in funzione della presenza di artefatti. Inoltre tra i diversi metodi di visualizzazione, quello che torna molto utile è relativo alla risoluzione della lightmap. Permette di visualizzare ed identificare tramite le colorazioni, le diverse densità e quindi poter immediatamente individuare quelle che magari sono carenti di dettaglio.

20

Altro metodo di visualizzazione è quello relativo al mesh distance field. Praticamente quest’ultimo dispone la visualizzazione, alla definizione delle geometrie interpretate dal software nel caso si attivi l’opzione della generazione del Ray Traced Distance Field shadows. Cosa che ho fatto per definire meglio le ombre in prossimità delle aperture in relazione agli spot interni.

21

L’inserimento delle sphere/box reflection capture mi ha permesso di ancor meglio definire le aree che necessitavano di riflessioni aggiunte, modificandone anche il range in corrispondenza degli oggetti presenti sulla scena. Il post process volume racchiude la maggior parte delle correzioni che generalmente si fanno con i programmi di fotoritocco. Quello su cui sono principalmente intervenuto riguarda la creazione di una LUT personalizzata che mi ha permesso di modificare il tono/ombre e luci nella scena.

Un appunto riguardo il walkthrough in funzione della collisione e per evitare l’intersezione del player con gli oggetti. Per poterla attivare e quindi gestirla, è necessario esportare dal programma di modellazione oltre alla mesh, anche un volume ad essa associata e che ne delimita l’area. Basta selezionare entrambi gli oggetti (mesh e il volume) e quindi sovrascrivere la geometria già esistente su Unreal. Infine ricordarsi di assegnare al nome del volume, la parola: UCX_stessonome rispetto all’oggetto principale.

Riguardo la vera e propria interazione, un paio di cose. Al programma nelle ultime versioni è stato aggiunto un editor visuale relativo alla programmazione, questo per rendere più agevole anche per coloro che come me, non hanno una approfondita conoscenza del linguaggio C++.
Di questo comunque se ne occupato il mio collega, la sua competenza ci ha permesso di sfruttare e integrare nella demo tutto ciò che ci necessitava, che nel nostro caso riguardavano la sostituzione degli oggetti e cambiamento degli shader, anche tramite la realizzazione di una UI personalizzata. Tutta la demo comunque non è stata particolarmente ottimizzata, sono ancora presenti svariati bug, ma il fine che ci eravamo prefissati è stato comunque raggiunto.
Vi allego l’immagine del blueprint che ho sviluppato e legato all’uso dei tasti numerici per utilizzare il cambiamento dei materiali che usavo nei vari test preparatori.

22

Per le sequenze iniziali che sono nel video ho utilizzato il matinee, il modulo che permette di sfruttare tramite l’inserimento di alcune chiavi sul movimento/rotazione delle camere, la creazione di piccole sequenze che possono essere inserite nel “packaging” del progetto finale.
Considerazioni.
L’aspetto che mi ha più interessato del software riguarda sicuramente l’approccio, che secondo me, è più creativo nello sviluppo e finalizzazione di un progetto, qualsiasi esso sia. Inoltre la possibilità di modificare in tempo reale gli shader, disporre di un controllo immediato ed intuitivo delle luci, navigare all’interno della scena con una qualità grafica di tutto rispetto, inoltre, il porting su dispositivi mobili/web e la possibilità di consegnare al cliente un file eseguibile tramite il quale può interagire ed apprezzare meglio il progetto in ogni singolo aspetto, credo che siano tutta una serie di peculiarità da non sottovalutare, in prospettiva del miglioramento del lavoro anche al fine di una più incisiva comunicazione.

Per concludere nel link qui di seguito, il file eseguibile per formato windows a 64 bit.

Unreal_app_demo

Basta effettuare il download (240mb compresso – decompresso 800mb); non necessita di nessuna installazione (basta lanciare il file “eseguibile” ) se non quella dei prerequisiti che si trovano nella cartella \Engine\Extras\Redist\en-us, ma solo nel caso che non funzioni.
All’interno del game, il pulsante destro del mouse attiva la selezione dei possibili oggetti modificabili: pavimentazione, divano, tavolo, sedie e cucina. Il tasto sinistro (posizionandosi sopra all’oggetto, tranne per il pavimento) permette la sostituzione delle mesh e degli shader.
I tasti per il movimento sono questi:
W = AVANTI
S= DIETRO
A= SINISTRA
D= DESTRA
Q= ZOOM
BARRA SPAZIATRICE= SALTO

La combinazione di tasti ALT + INVIO, sempre all’interno del game, permette la visione a pieno schermo, altresi, se si intendesse impostare una risoluzione precisa, basta creare un collegamento al file eseguibile ed aggiungere alla linea di comando la stringa  -ResX=valore -ResY=valore

Ad esempio:
UNREAL_APP\WindowsNoEditor\ESEGUIBILE.exe” -ResX=1920 -ResY=1080

 

n.b.

Rendering e video riguardanti dei test sull’illuminazione e programmazione sviluppati su Unreal Engine.
Designer: Arch. Francesco Galuppo & Arch. Angela Fiorenza