» it.Tutorial Morphing della Geometria basato sulla CPU
This site relies heavily on Javascript. You should enable it if you want the full experience. Learn more.

it.Tutorial Morphing della Geometria basato sulla CPU

English | French | Russian | Japanese

Successivo: GPU. L'approccio semplice

L'approccio basato sulla CPU

Come probabilmente già saprai, quando si lavora col morphing geometrico sono necessari 2 modelli 3d, che non solo devono avere lo stesso numero di vertici, ma questi vertici dovrebbero essere indicizzati (ordinati) nella stessa maniera. Se uno di questi prerequisiti non viene soddisfatto, si può comunque tentare il morphing, ed ottenere anche degli ottimi risultati.

Come generare modelli 3d ugualmente indicizzati con il tuo software preferito non verrà trattato qui. In questo tutorial tenteremo il morphing tra due cilindri primitivi nativi di vvvv. E quindi:

Preparare gli oggetti per il morphing

Prima di tutto costruisci una patch che disegna 2 cilindri l'uno sull'altro, uno rosso ed uno verde, uno lascito così com'è, l'altro a "testa in giù": i nostri obiettivi del morphing. Lavora sulla patch finché non ottieni qualcosa di simile alla figura qui sotto.

Tieni presente che il nodo Camera (Transform Softimage) ed il nodo AspectRatio (Transform) non sono essenziali, ma se ti stai chiedendo perché non siano essenziali, allora dovresti generarli, connetterli e farci pratica.

Spostando il cursore sopra l'output dei cilindri, si può notare come la connessione al nodo GouraudDirectional (EX9.Effect) sia di tipo Mesh. Una mesh consiste di un vertexbuffer e di un indexbuffer. Mentre l'indexbuffer in vvvv è rappresentato come un semplice spread, il vertexbuffer è una sorta di contenitore per molte componenti della geometria. Connettendo un nodo VertexDeclaration (EX9.Geometry Mesh) al cilindro, e spostandoci sopra il cursore, il suo output mostra in cosa consistano le componenti del vertice del cilindro: i valori di Posizione (Position), Normale (Normal) e Coordinate della Texture (TextureCoordinate). Altre meshes possono includere altre componenti.

Non c'è ancora un unico nodo in vvvv che, affibbiategli due meshes, si prende la briga di fare tutto e di consegnarci un morphing bello e pronto. E siccome probabilmente non ci sarà mai un nodo del genere (pare che sia pall*s* da sviluppare) e dato che comunque vuoi sapere come funziona la baracca, andremo ora a lavorare sulla patch per ottenere lo stesso risultato che questo nodo ci restituirebbe.

Accedere al Vertexbuffer

Ora abbisogniamo di un nodo per accedere a tutti componenti di una mesh. Guarda la patch qui sotto e vedrai come usare un nodo Mesh (EX9.Geometry Split) seguito da un nodo VertexBuffer (EX9.Geometry Split) per leggere tutti i dati di un vertice. La patch dimostra anche come questo processo possa essere invertito. Il nodo Mesh (EX9.Geometry Join) preceduto dal nodo VertexBuffer (EX9.Geometry Join) ri-assembla il cilindro in una mesh valida perché il nodo GouraudDirectional (EX9.Effect) lo possa disegnare.

Nota bene!
L'indexbuffer in output di Mesh (EX9.Geometry Split) viene direttamente collegato all'input di Mesh (EX9.Geometry Join)
Le componenti Position e Normal dei vertexbuffers passati direttamente dall'output di VertexBuffer (EX9.Geometry Split) all'input di VertexBuffer (EX9.Geometry Join).

Fare il Morphing

Vedendo questo avrai provato ad immaginarti come si faccia ad ottenere qualcosa, a questo punto. Ci manca solo la parte che esegue il morphing tra i due nodi VertexBuffer. Ripeti col cilindro verde quello che hai fatto con quello rosso... ffffatto? Non avendo colla vinilica ci accontenteremo di generare e connettere un nodo InputMorph (Value) per ottenere il morphing.

Dato che il colore non è una delle componenti del vertexbuffer, ma un parametro per l'effetto, il morphing per il colore deve essere eseguito separatamente con un nodo InputMorph (Color). Spostando il valore di InputMorph (Color) tra 0 e 1 otterremo una fusione armonica tra il cilindro rosso e quello verde a testa in giù. Domande?

Con questo approccio tutti i calcoli necessari vengono passati alla CPU. Quindi, poiché vertxbuffer e/o mesh nuovi vengono generati ad ogni fotogramma in cui il pin Apply sia 1 sui rispettivi nodi, questo richiede del tempo.

Questo non è un problema finché stai lavorando con meshes non troppo complesse (complessità che è quindi in relazione alla potenza della tua CPU). Se pensi che tutto sia troppo lento leggi l'approccio approccio basato sulla GPU.

Bonus

Guarda cosa succede se usi due modelli che non corrispondono nel vertexcount e negli indici. Rimpiazza il primo cilindro, con un doppio clic, con il nodo Teapot (EX9.Geometry). Ti ricordo che la colla vinilica è finita...

Successivo: GPU. L'approccio semplice

anonymous user login

Shoutbox

~3d ago

skyliner: the vcard page is assembled by personal settings + user page

~3d ago

lasal: thank you guys but this is to edit the user data, i don't find how to edit the vcard

~3d ago

CeeYaa: @lasal - haha nice - I think it's funny - you should keep it ;) to change - HOME-SETTINGS - PERSONAL SETTINGS

~3d ago

skyliner: @lasal: here?

~3d ago

lasal: who knows how to edit the vcard?

~3d ago

joreg: get started with #vl with this first part of a series of "vl for vvvv users" tutorial: https://discourse.vvvv.org/t/vl-for-vvvv-users-key-differences-1-5/15919 #vvvv

~3d ago

joreg: speak japanese? this looks like a great resource for #vvvv tipsntricks: https://qiita.com/advent-calendar/2017/vvvv