English | French | Russian | Japanese
Successivo: GPU. L'approccio semplice
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:
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.
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.
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?
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.
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
~3mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~4mth ago
~5mth ago
~5mth ago