RIGGING

terza parte - il collo





Ed eccoci arrivati alla prima delle parti più simpatiche, il collo...

Il collo, con il rig fino a qui creato, segue il busto, noi glielo impediremo...ero indeciso se mettere uno switch per il collo(e la testa) per farlo automatico e manuale, ma alla fine ho visto che tanto, anche se un po'...dovevo sempre muoverlo, allora, tanto vale farlo manuale.

Qual è la tecnica per un effetto del genere?

Vediamo in breve la tecnica completa.

Creiamo una piccola catena di joints, tipo dal gomito alle dita, in questa maniera


Image 45

ruotando il gomito, come vedete, il polso segue la rotazione

Image 46

rimettiamo tutto a posto e selezioniamo il polso.

Duplichiamolo, otterremo polso1 con i due figli dito1 e dito2(le copie), eliminiamoli e rinominiamo polso1 come polso_ori, poi duplichiamolo(stavolta non avrà figli)e rinominiamolo polso_fix.

A questo punto tutti i polsi sono ancora figli del gomito e avranno tutti la stessa posizione e lo stesso orientamento, quello che vogliamo...selezioniamo polso fix e Unparent.

Image 47

Ora naturalmente se ruotiamo il gomito, polso_fix non si muove...non importa, ma è scomodo, portiamocelo dietro...selezioniamo prima polso, poi polso_fix e point constraint.

Fino a qui inon camba ancora niente, allora selezioniamo prima polso_ori poi polso e facciamo un orient constraint, poi selezioniamo prima polso_fix poi polso e facciamo un altro orient constraint.

La situazione sarà questa:

Image 48

Ora...abbiamo polso_ori che, essendo un figlio di...gomito avrà lo stesso 'comportamento' che aveva polso all'inizio, e polso_fix che invece rimarrà sempre orientato com'è fregandosene di gomito, visto che non ha niente a che spartire con lui, tranne un point constraint con un suo figlio che ne detta la posizione ma non l'orientamento.

Però ora come ora, polso è vincolato in egual misura sia a polso_ori che a polso_fix, quindi, ruotando gomito, assumerà un orientamento che sarà una via di mezzo tra i due, allora noi selezioniamo polso_orientConstraint1 e mettiamo a 0 l'attributo polso_fixW1(l'ultimo, se avete seguito le mie istruzioni).

Image 49

ruotiamo gomito...tutto esattamente come prima....ma...(perchè c'è un ma)

Image 50

Rimettiamo tutto a posto e selezioniamo di nuovo polso_orientConstraint1 e rimettiamo a 1 l'attributo polso_fixW1 e a 0 l'attributo polso_oriW0.

Image 51

Ruotiamo di nuovo gomito...

Image 52

Et voilà....il nostro polso rimane fisso....naturalmente possiamo sempre ruotarlo, basta agire su polso_fix(e, nel caso precedente, su polso_ori).

Ora applichiamolo al nostro pupazzetto...

Per quanto riguarda il collo e la testa, non creeremo un joint_ORI, ma solo un FIX, in quanto, come ho detto prima, non mi serve la differenza, cosa invece che sarà importante sul polso, lo spiegherò(ormai avrete capito che se mi ci metto sono logorroico...ma non è contagioso).

Semplicemente prendiamo j_sk_Neck_0, duplichiamolo, cancelliamo dal nuovo joint tutti i figli e chiamiamolo j_Neck_Fix.

Facciamo un point constraint (neck + neck_Fix) e un orient constraint (neck_Fix + Neck).

Questo è il risultato ora ruotando il Root.

Image 53

E' un buon inizio...costruiamo un controllo per il collo, il solito cerchio va più che bene, chiamiamolo ctrl_Neck, snappiamolo su j_sk_Neck_2(al centro del collo, per comodità), e leghiamocelo con un point constraint.

Anche a me da qui in poi sembrava facile, ma guardate che succede...come per la spine, colleghiamo la Rotate del controllo con la rotate di tutti i joint del neck, ma ATTENZIONE, non prendete j_sk_Neck_0, prendete j_Neck_Fix, è lui che controlla il primo joint.

Image 54

Riproviamo ora a ruotare il nostro Root e poi il controllo del collo....

Image 55

Visto cosa succede? dove il collo si attacca al corpo, proprio non va....bisogna trovare una soluzione...

io vorrei che ruotando la root il collo assumesse questa posizione:

Image 56

vedete come il collo è un po' più naturale? Poi, ruotando il collo...

Image 57

si vede come esce in maniera più 'umana'(Fantozzianamente parlando) dal corpo...

La matematica e qualche nodo accorreranno in nostro aiuto...

Dobbiamo calcolare innanzi tutto di quanto deve ruotare il nostro j_Neck_Fix alla rotazione della Root e dei nodi della spine,

e lo stesso i vari nodi del collo, in modo da avere un risultato che dia un senso di continuità...è un personaggio 3d, ma un minimo di credibilità la deve avere...



Dunque...il Root è uno, mentre la spine è formata da 5 joints...il che significa che la rotazione finale, dell'ultimo joint, per intenderci, è come se fosse data da: Root + 5*spine;

ruotando ad esempio sia la root che la spine di 15°, il nostro pupo si troverà con l'ultimo joint come se fosse a...90°

Image 58

Allora...chiamiamo R la rotazione totale, che è data dalla somma della rotazione del Root + la rotazione della spine moltiplicata per 5 joints:

R = Root + 5 * Spine (nel nostro esempio R = 15° + 5 * 15° = 90°)

Se noi attribuiamo a NeckFix il valore di R (90°) avremo il collo sulla stessa linea del corpo, come se non avessimo messo il NeckFix(Vedi i primi esempi all'inizio della pagina), quindi dobbiamo ruotare all'indietro il collo di quel tanto che basta per riportare la testa come se la rotazione del busto non ci fosse stata...essendo il collo formato da 4 joints, dobbiamo distribuire in negativo R/4 (90° / 4 = 22.5°).

Il NeckFix però non parte da 0, ma da R, quindi avrà R - R/4 (90° - 90°/4 = 67.5°), e di conseguenza le altre 3 ossa del collo avranno -22.5°.

Quindi:

R = Root + 5 * Spine;

NeckFix = R - R/4;

Neck1,Neck2,Neck3 = - R/4;

A tutto ciò poi dobbiamo sommare la rotazione che vogliamo dare noi al collo mediante ctrl_Neck, altrimenti avremmo un collo che si muove in base alle rotazioni del busto e basta, quindi, ai valori ottenuti, dobbiamo sommare la rotazione del controllo, che chiameremo rc.

R = Root + 5 * Spine;

NeckFix = (R - R/4) + rc;

Neck1,Neck2,Neck3 =  - R/4 + rc;

potremmo fare il tutto con una espressione, ma, per evitare che questi valori vengano calcolati anche quando non ce n'è bisogno, utilizzeremo degli utility nodes.

Organizziamoci...abbiamo bisogno dei seguenti risultati:

innanzi tutto R

per farlo abbiamo bisogno di: fare Spine * 5 e sommare il risultato a Root;

Selezioniamo quindi ctrl_Root e ctrl_Spine, poi apriamo l'hypergraph e creiamo un nodo MultiplyDivide(md_Spine5 con input2X,Y e Z = 5) ed un nodo PlusMinusAverage(pma_RootSpine).

Colleghiamo ctrl_Spine.Rotate con md_Spine5.Input1...per quanto riguarda il "pma" node, bisogna agire in maniera leggermente macchinosa, quindi seguitemi poi spiego:

trascinate con il tasto centrale ctrl_Root su pma_RootSpine, scegliete other e selezionate rotate dalla sinistra e input3D a destra...non so se è un problema mio, ma probabilmente non vedrete succedere niente, state tranquilli e chiudete il connection editor, poi trascinate con il tasto centrale md_Spine5 ancora su pma_RootSpine, scegliete other e selezionate Output dalla sinistra e ancora input3D a destra e chiudete il connection editor.

Ora andate sull script editor e nella history selezionate le ultime 6 righe(praticamente i due connectAddr...e portateli sotto)

Image 59
Image 60

poi eliminate la seconda, terza e quarta riga(l'ultima potete anche non eliminarla, tanto è segnata come commento)

Image 61

Sulla seconda riga, alla fine tra parentesi quadre invece di 0 mettete 1

Image 62

Poi premete enter sul tastierino numerico o fate click con il destro e scegliete execute...

Il PlusMinusAverage Node prende vari input di uno, due o tre numeri e li somma, sottrae o ne fa la media restituendo il risultato su un output ad uno, due o tre numeri...simile al MultiplyDivide, ma invece di prendere solo due input, e quindi avere un numero fisso di entrate, si crea un array di valori, indicati dalle parentesi quadre.Non so se lo fa con tutti, ma il mio Maya da connection editor non riesce a farlo, quindi devo aggirare l'ostacolo mediante lo script editor.

Ora abbiamo i nostri primi numeri...e cioè abbiamo trovato il famoso R, che troveremo nell'output3D del pma_RootSpine.

Per trovare R/4 basterà creare un MultiplyDivide node(md_Root4Neck input2X,Y e Z = 0.25) e collegare l'output del pma_RootSpine con l'imput1 del md_Root4Neck.

Abbiamo fatto la parte in grassetto:

R = Root + 5 * Spine;

NeckFix = (R - R/4) + rc;

Neck1,Neck2,Neck3 = - R/4 + rc;

Ora troviamo R - R/4.

Creiamo un PlusMinusAverage(pma_MinusFix_Neck cambiandogli nell'attribute editor l'operazione in subtract)...bene, ora stiamo attenti, se quando sommiamo possiamo permetterci di mettere gli addendi come ci pare, quando sottraiamo no, quindi PRIMA colleghiamo l'ouput3D di pmaRootSpine, all'input3D del pma_MinusFix_Neck, POI colleghiamoci l'output di md_Root4_Neck, naturalmente dovremo riandare nello script editor e seguire la procedura di prima.

Ora creiamo un pma_PlusFix_Neck dove sommeremo pma_MinusFix_Neck e ctrl_Neck.Rotate.

Image 63

Chiaro, no? :)

E' rimasta l'ultima parte, e cioè:

Neck1,Neck2,Neck3 = - R/4 + rc;

ormai dovrebbe essere semplice:

facciamo un md_MinusRoot4Neck(input2X,Y e Z = -1) e colleghiamo al suo input1 l'output di md_Root4Neck, così troviamo - R/4.

facciamo un pma_Plus_Neck dove sommiamo ctrl_Neck e md_MinusRoot4Neck, e l'output lo mandiamo a j_sk_Neck1,2 e 3.

E così abbiamo fatto.

Image 64

---
Questo articolo è stato importato automaticamente dal forum il 31/lug/2014
Per vedere il post originale e/o i commenti sul forum prima di quella data clicca qui