7.5 – Dinamica Fisica – Sistemi Volumetrici: Smoke

In quest’ultima parte del capitolo tratteremo la dinamica di alcuni sistemi volumetrici quali fumo, fuoco e fluidi. Tramite il framework open source Mantaflow, Blender offre un’avanzata simulazione fisica di suddetti sistemi, la quale avverrà esclusivamente all’interno di un limitato volume cubico denominato Domain. Nonostante sia possibile attribuire a qualsiasi mesh il ruolo di domain, Blender utilizzerà comunque un cubo dal lato pari alla dimensione maggiore della mesh indicata. Il Domain viene quindi suddiviso in una matrice discreta di Pixel 3D che potete immaginare come tanti piccoli cubi (chiamati Voxel). Al domain è necessario assegnare uno shader volumetrico ricorrendo all’ottimo Principled Volume. Partiamo da un esempio molto semplice utilizzando un cubo per domain e un piano come superficie designata a emettere del fumo. Create una scena come nell’immagine seguente, con il piano situato all’interno del cubo, un po’ sopra la sua base.

Assegniamo la fisica al Domain e al piano emettitore selezionando per entrambi Fluid nel contesto Physics delle properties. Per il cubo impostiamo Domain in Type e Gas in Domain Type, lasciando al momento tutto come impostato di default, tranne il valore Resolution Divisions che lasceremo a 32 in modo da poter eseguire delle prime prove con un sistema abbastanza semplice, poiché tale parametro determina direttamente il livello di discretizzazione del domain in uno spazio Voxel, e quindi la precisione complessiva della simulazione.

Come per i sistemi studiati nei paragrafi precedenti, è possibile osservare l’andamento della simulazione in pseudo real time semplicemente con la barra spaziatrice, ma considerata la complessità dei sistemi volumetrici è conveniente precalcolare volta per volta l’animazione. Dunque nel pannello Cache selezioniamo Modular nel campo Type ed eventualmente cambiamo il numero di frame in End (range 1-250 della scena di default di Blender).

Per il piano emettitore abbiamo scelto Flow (flusso – immagine seguente) impostando Inflow nel campo Flow Behavior (vedremo in azione l’Outflow trattando i sistemi liquidi). Ora avviamo l’animazione (barra spaziatrice) e l’animazione verrà calcolata frame dopo frame. Alla fine dell’elaborazione potremo osservare il risultato nella 3D View (in modalità wireframe o solid) al frame rate impostato per l’animazione.

Il piano emette uniformemente del fumo che sale verso l’alto creando vortici e un piccolo fungo, almeno fino a quando questo non raggiunge il limite del domain oltre il quale non potrà espandersi. Al momento non preoccupiamoci del rendering finale dato che le impostazioni adottate sono utili per verificare le principali caratteristiche e il comportamento di questi sistemi in tempo reale. Nonostante lo smoothing operato dallo shader nell’anteprima, è possibile notare la suddivisione del volume in una matrice voxel le cui dimensioni sono evidenziate dal piccolo cubo wire frame visibile in uno spigolo del domain. Lo shading in realtime è il medesimo per le modalità wireframe/solid ma può essere raffinato nel pannello Viewport Display del contesto physics relativo al domain. Un parametro importante per il piano emettitore è Density (di default pari a 1) potete provare a variare tale densità (fino ad azzerarla) tramite keyframe e osservare la realistica evo1luzione del fumo. Con Initial Temperature (differenza di temperatura tra sistema gassoso e ambiente) è possibile aumentare o diminuire la velocità di emissione del fumo. Nelle opzioni smoke del domain troverete il parametro vorticity (0,0 – 4,0) utile ad aumentare la tendenza caotica del fumo a creare vortici (in funzione anche della velocità di emissione, come detto legata a Initial Temperature). Provando ad animare il piano durante l’emissione, osserverete che l’evoluzione del fumo viene resa più complessa dal movimento della superficie emettitrice. Naturalmente i movimenti del piano potranno essere regolati da keyframes, come anche dalle dinamiche studiate nei paragrafi precedenti e applicabili alla superficie.
Le parti della mesh emettitrice che vengono a trovarsi fuori dal domain non emetteranno più del fumo. Potrete attivare l’emissione da specifiche parti di una mesh definite da un vertex group, oppure ricorrendo a una qualsiasi texture procedurale ad esempio del tipo Distorted Noise. In tal caso occorre attivare il pannello Texture nella fisica Smoke Flow per il piano, e qui scegliere la texture, le proiezioni di mappatura, le dimensioni (Size) e infine la posizione (Offset):

La texture agirà come intensity map e le zone mappate con i colori più chiari saranno quelle da cui avverrà l’emissione maggiore. Potrete utilizzare una texture procedurale definita nell’apposito contesto, icona .

Per ottenere una simulazione più accurata dell’emissione di fumo, aumentando di conseguenza i tempi necessari al calcolo della dinamica, è sufficiente riportare il parametro Resolution Division a 64 o anche a valori maggiori nel caso il vostro computer fosse ben carrozzato. Il numero di pixel 3D corrisponderà proprio al valore di Resolution elevato al cubo (motivo per cui conviene non esagerare). A fine elaborazione scegliete uno dei fotogrammi visibili nella 3D View, e passate al rendering dello stesso solo dopo aver opportunamente settato il Principled Volume (che vi ricordo è da assegnare al domain) e diminuito (non di troppo) il valore di Step Size nel pannello Volumes del contesto render (parliamo dell’engine Cycles). Nell’immagine (in basso) ho impostato un’illuminazione diretta molto semplice e inserito la mesh Monkey per evidenziare la natura volumetrica e semitrasparente del sistema Smoke. Ma non mi sono limitato a ciò, infatti alla primitiva suzanne ho conferito al fisica Fluid > Effector (impostazioni di default), in modo che il fumo nella sua evoluzione collidesse con la superficie.

Esiste anche la possibilità di ricorrere a un’evoluzione adattiva del domain, che così non resterà più fisso a limitare l’emissione di fumo, ma aumenterà in funzione dell’estensione dello stesso. A tal scopo è necessario attivare il pannello Smoke>Adaptive Domain.

Nell’elaborazione finale viene creato da Blender un domain più piccolo, effettivo, il quale si espanderà fino ad eguagliare le dimensioni massime del Domain originale, ulteriormente aumentabili con il parametro Add Resolution (ciò all’inevitabile prezzo di una maggiore pesantezza dell’elaborazione). Chiaramente una qualsiasi emissione di fumo (come anche di vapore) non potrà creare delle colonne alte senza limite, poiché trascorso un certo intervallo di tempo dall’emissione e raggiunta una certa altezza, il fumo tenderà a svanire. Il tempo lo si imposta nel pannello Fluid > Dissolve. Aumentando il valore in Time il fumo sparirà più rapidamente.

Ora che sappiamo come realizzare una simulazione realistica del fumo, perché non aggiungere anche delle fiamme? Vediamo come procedere per incendiare la mesh Suzanne: inseritela nella scena e applicate ad essa il modificatore Subsurf (rendering: 2) con smooth shading attivo. Il domain sarà questa volta un cubo scalato in altezza lungo la direzione y. Impostate tutto come nelle immagini a seguire, variando eventualmente i parametri per diminuire o aumentare la precisione quindi il tempo di calcolo.

Fisica Domain

Ricordo che nel pannello Cache ho impostato Modular in Type al posto di Replay (default), in modo da calcolare l’animazione cliccando su Bake Data nel pannello Fluid>Setting.

Fisica Suzanne

Per quel che riguarda il rendering in Cycles (che vale anche per eevee sebbene con una scarsa qualità del rendering volumetrico) stavolta dovremo combinare due shader volume, quello per il fumo a quello per le fiamme, le quali per loro natura dovranno illuminare l’ambiente circostante. Ci viene ancora incontro l’ottimo Principled Volume che prevede l’emissione luminosa. Per sommare correttamente i due shader dovremo ricorrere al nodo Attribute (famiglia input) come nell’immagine

Nei due nodi dovremo correttamente inserire density e flame nel campo name e collegare tutto come in figura. Il nodo color ramp è possibile configurarlo a seconda del risultato cercato. Io ho scelto un’interpolazione lineare tra 4 tonalità: nero, arancione, giallo e bianco, con trasparenza alpha crescente (nero completamente opaco, bianco trasparente).

Paragrafo successivo
Paragrafo precedente

Torna all’Indice


Nell’augurarti un divertente e produttivo studio di Blender, ti ricordo che puoi supportare questo progetto in due diversi modi: con una piccola donazione (paypal) oppure acquistando la versione PDF (su lulu.com) impaginata in modo professionale e ottimizzata per la visione su Tablet.  



>Acquista l’ebook (PDF) su lulu.com in piena sicurezza con paypal e carte prepagate<