PREVIOUS article

DevLog #019: il problema del sacchetto della spesa - PARTE 2/3 [15/09/2019]

NEXT article

DevLog #022: il problema della resa differente degli shader in file diversi [22/09/2019]
DevLog #020: il problema del sacchetto della spesa - PARTE 3/3 [15/09/2019]

IPOTESI 5: realizzarlo tramite una simulazione “cloth” di Blender

Come già discusso relativamente alla modalità "sculpt" di Blender o meglio relativamente alle mie capacità nella modalità sculpt di Blender, potremmo fare un discorso analogo per quanto riguarda la "cloth simulation".
Immagino che la maggior parte delle persone che si occupano attivamente di 3D sanno di cosa sto parlando tuttavia ritengo opportuno fare un super riassunto dell'argomento in questione.
Blender dispone al suo interno di un motore di simulazione di fisica, ossia è in grado di simulare azione ed effetti di una serie di forze come il vento e le turbolenze piuttosto che la forza di gravità.
Alcuni strumenti all'interno di Blender consentono di generare una serie di effetti tramite delle interfacce apposite che potremmo definire di alto livello, studiate per permettere agli utilizzatori del software di sfruttare il motore fisico senza dover impazzire con righe di codice di programmazione e un manuale di fisica aperto sul tavolo. Uno degli strumenti disponibili all'interno di Blender permette di simulare il comportamento reale di tessuti ed è appunto chiamato cloth simulation.
Adesso torniamo a parlare un attimo del progetto e della problematica che stiamo affrontando ossia realizzare un modello 3D di un sacchetto della spesa che sia visivamente realistico.
Nei DevLog precedenti abbiamo già discusso di tutte le altre possibili soluzioni ed al momento una sola, la fotogrammetria,  è risultata vagamente percorribile anche se con una certa difficoltà.
L'ultima carta da giocare che ci è venuta in mente consiste nel cercare di generare il sacchetto simulandone fisicamente in modo credibile e realistico il comportamento.
Ancora prima di cominciare ci siamo resi conto di alcuni possibili intoppi nella realizzazione di questa soluzione:

  1. Per prima cosa il sacchetto (reale) potremmo considerarlo senza spessore ed in quanto tale potremmo avere qualche difficoltà a gestirne pieghe e risvolti
  2. In secondo luogo Blender dispone di un simulatore di tessuti ed il sacchetto (che per comodità chiamerò sacchetto di plastica anche se probabilmente plastica non è) ha un comportamento sicuramente differente dalla stoffa, in relazione al suo peso, a come reagisce alla forza di gravità, agli oggetti che spingono dall'interno e per finire la conformazione delle pieghe

A questo scenario incerto e poco rassicurante aggiungiamo un altro dubbio grosso come un macigno: sull'argomento simulazione tessuti parto totalmente e completamente da zero, è un argomento che non ho mai affrontato in precedenza se non seguendo semplici tutorial per pura curiosità.
L'unica differenza rispetto allo sculpt è che i semplici tutorial che ho provato a seguire hanno funzionato subito e velocemente in modo corretto dandomi una vaga sensazione di sicurezza... un vago senso di confidenza con gli strumenti sufficiente a spingermi a fare qualche tentativo.

Preparazione del modello

Innanzitutto ho cercato di modellare la mesh del sacchetto in modo credibile ossia più simile possibile al l'equivalente modello reale, quindi ho preso il mio bel sacchetto di plastica l'ho steso vuoto e piatto sul tavolo e ho iniziato a studiarne pieghe, anfratti e saldature e ho replicato fedelmente tutto in 3D.


Ricordavo che il modello deve essere suddiviso abbondantemente per ottenere una simulazione realistica quindi per cercare di non creare disomogeneità nella mesh ho generato il modello di partenza con meno facce possibili tenendole volutamente al minimo (in realtà questo si è rivelato un problema in seguito).
Sono abbastanza sicuro che ci sia un modo semplice e veloce per fare ciò di cui avevo bisogno tuttavia non sono riuscito a trovarlo quindi mi sono dovuto arrangiare in altro modo.
Il punto è che una volta ottenuto il modello di partenza con il minimo indispensabile delle facce, il passaggio successivo prima di procedere alla simulazione è stato suddividere tutte le facce in un reticolato più fitto e omogeneo possibile.
Nella mia più totale completa ignoranza ero convinto che sarebbe bastato utilizzare uno strumento chiamato remesh ossia un modificatore presente in Blender che sostituisce la mesh selezionata con una nuova ricalcolata in base a certi parametri...
Tuttavia dopo un po' di tentativi con questo modificatore non sono riuscito a ottenere un risultato soddisfacente poiché ogni applicazione che ho tentato ha portato a deformazioni vistose del modello originale al punto da renderlo irriconoscibile o inutilizzabile.
Allora sono passato a tentare di suddividere il modello utilizzando un'altro modificatore: il celebre subdivision surface modifier.
Come sarà sicuramente noto a chiunque abbia già provato utilizzare questo modificatore, uno dei problemi principali è che suddividendo le facce del modello si ottiene una deformazione dei Bordi che vengono smussati, arrotondati e ridotti.
Se esiste un metodo corretto per evitare che i contorni dell'oggetto vengano alterati io non ne sono a conoscenza o meglio gli unici due metodi che conosco sono quello di generare preventivamente più edge in prossimità dei contorni oppure utilizzare il parametro di mean crease per influenzare il modificatore in prossimità degli edges selezionati.
Sfortunatamente nessuno dei due metodi appena esposti ha portato risultati soddisfacenti e anche qui non mi sento di incolpare nè strumenti nè metodo, quanto piuttosto la mia totale inesperienza in questo tipo di modellazione e lavorazione.
Alla fine per farla breve pasticciando un po' con quello che avevo a disposizione ho ottenuto una suddivisione e una forma vagamente soddisfacente utilizzando il subdivision surface modifier e ho deciso di passare alla simulazione vera e propria. Non ero particolarmente soddisfatto del modello però il reale problema me lo aspettavo nella simulazione dei tessuti, non nella suddivisione di un modello già fatto... e non volevo alienarmi e perdere troppo tempo a migliorare il modello di partenza perché temevo che la simulazione dei tessuti avrebbe fallito miseramente il suo compito di ricreare il modello come lo desideravo.

cloth simulation

I primi test di simulazione dei tessuti infatti non sono stati per niente incoraggianti, il modello del sacchetto finiva per accartocciarsi in malo modo e poi decollare come un proiettile verso lo spazio aperto...
Non avendo solide basi in questo campo l'unico modo che avevo per procedere era per tentativi, ma non è stato facile soprattutto per via del mio carissimo computer ormai attempato che ci metteva parecchio tempo a generare ogni bake della simulazione.
Ho notato fin da subito che aumentando la suddivisione della mesh i risultati miglioravano sensibilmente, tuttavia avevo dei comportamenti inaspettati e indesiderati in prossimità dell'appoggio del sacchetto sul tavolo (un piano creato apposta al di sotto) ed al comportamento delle maniglie del sacchetto che non si piegavano opportunamente sottoposte alla forza di gravità.
Una breve indagine on-line mi ha portato a scoprire che apparentemente la simulazione di tessuti di Blender è fatta in modo che il tessuto riconosce le collisioni con altri oggetti definiti appunto come ostacoli o anche solo rigid bodies però i deflettori e i rigid bodies invece non rilevano il contatto con il tessuto. Quindi è solo il tessuto ad interagire con loro e non viceversa.
Questo dettaglio apparentemente insignificante in realtà ha vanificato la mia idea iniziale di ricreare il sacchetto simulando il comportamento del mondo reale ossia appoggiandolo leggermente sul piano, tenendo sollevate le maniglie ed infilando (letteralmente facendo cadere) nel sacchetto le geometrie per simulare la spesa.
È bastato qualche tentativo per avere conferma di quanto detto online ossia che realizzando i i volumi da inserire nel sacchetto come rigid bodies e facendoli precipitare per gravità all'interno del sacchetto, questo inizialmente subisce la deformazione dovuta ai volumi che però proseguono nella loro caduta verticale attraversando il sacchetto senza venirne minimamente rallentati.
Ho modificato quindi la strategia di conseguenza e ho provato a:

  1. impostare i volumi da inserire nel sacchetto semplicemente come deflettori posizionandoli all'interno del sacchetto in scala e posizione adeguata (molto piccoli) e congelando quella situazione all'istante zero con dei keyframe su posizione, rotazione e scala assicurandomi che tutti questi volumi non fossero a contatto con le pareti del sacchetto.
  2. animare i volumi facendoli aumentare di dimensione gradualmente fino alla dimensione desiderata e facendoli scendere in verticale fino a riempire il fondo del sacchetto, tutto in modo più graduale possibile per dare il tempo alla simulazione di adeguare la forma del sacchetto ai cambiamenti dei volumi interni
  3. ho comunque utilizzato un altro deflettore planare sotto il sacchetto per cercare di mantenerlo in in una forma adeguata come se fosse un appoggio su un piano ed ho mantenuto le maniglie in posizione tramite dei toroidi

Iterando diverse volte su animazione, keyframe e bake fino a ottenere la forma desiderata, una volta trovata la giusta composizione ho semplicemente applicato i modificatori per dare alla mesh la forma definitiva.


Tuttavia rimaneva ancora il dettaglio delle maniglie del sacchetto sostenute durante la simulazione e congelate in una forma innaturale.
Per risolvere la questione ho inizialmente provato a riapplicare un modificatore di tipo tessuto al sacchetto formato in questo modo per provare a lasciar cadere per gravità le maniglie sul sacchetto, ma i risultati non sono stati soddisfacenti perché nel momento in cui le maniglie non erano vincolate facevano scivolare quasi completamente il sacchetto ai lati del contenuto fino a farlo accasciare totalmente sul tavolo, di conseguenza non era il risultato corretto.
Sono abbastanza convinto che con un'opportuna regolazione dei parametri legati alla rigidità del tessuto sia possibile ottenere l'effetto desiderato ma non ne sono in grado, non ne sono stato capace, quindi ho preferito un approccio un po' più spartano: ho rimosso il simulatore cloth dalla mesh e ho provveduto alla modifica manuale utilizzando l'editing proporzionale dei vertici ossia facendo in modo che selezionando un gruppo di vertici e spostandolo questo spostamento influenzasse in una proporzione via via decrescente in base alla distanza anche sui restanti vertici collegati della stessa mesh.
Procedendo in questo modo quindi ho piegato le maniglie del sacchetto in una posizione più naturale.
Dopo diversi giorni di sperimentazione su questo argomento e innumerevoli tentativi falliti sono finalmente arrivato al primo risultato soddisfacente e per il momento ho deciso di tenerlo buono.