Vai al contenuto

Logo

Rig In 5 Parti...seconda Parte

Maya

  • Please log in to reply
Nessuna risposta a questa discussione

#1 70MadMax

70MadMax
  • Nazione (Country):n.d.
  • Località:Macerata (Marche)
  • Sesso (Gender):M
  • Impiego (Employment):n.d.
  • Area:Animation
  • Software:Maya, ZBrush, Photoshop, Mental Ray

Inviato 12 agosto 2009 - 11:25

RIGGING

seconda parte - Skinning e primo rig





Ed eccoci alla seconda parte di questo tutorial sul rigging...vedremo ora lo skinning.

Prima di eseguire lo skinning dovremo verificare l'orientamento di tutti i joints...uno per uno, per farlo selezioniamoli e visualizziamo i loro assi di rotazione (Display->Transform Display->Local Rotation Axes)

In genere lascio i nodi con gli assi di rotazione uguali a quelli del World, quindi quelli delle braccia ad esempio avranno la x tra un osso e l'altro e la y in su.

Un appunto...la caviglia...siccome il joint successivo(Ball) è inclinato rispetto alla caviglia, ruoto gli assi diquest'ultimo come il World.

Il pollice alla creazione avrà anche lui gli assi come il world, ma poi lo ruoteremo come detto all'inizio e faremo freeze transformation per riportare le rotazioni a 0.

Importante...prima di legare le ossa al modello, eseguiamo un freeze transformation su tutte le ossa(se lo eseguiamo ora, avremo un messaggio di errore perchè esiste un point constraint tra il Root e le anche, o 'freeziamo' le trasformazioni solo della rotazione, o eliminiamo un attimo il point constraint, 'freeziamo' e poi lo rimettiamo.

Se siete principianti e siete abituati a vedere tutti i valori tornare a 0 quando eseguite un freeze transform, sappiate che per quanto riguarda i joint il valore di translate non si azzera mai, è indispensabile a Maya per stabilire la posizione(assoluta se root joint, relativa al parent se child joint)di un joint nello spazio(e visto che l'ho scritto poche volte...joint joint joint).

Ora selezioniamo tutti i joints con prefisso "j_sk", poi la skin ed eseguiamo uno smooth bind; anche qui ci sono varie scuole di pensiero, c'è chi mette il valore Max influences a 1 in modo da non avere più di un joint che influenzi la skin e poi aumenta successivamente questo numero e lavora di paint skin weights...io preferisco lasciare il valore di default, cambio solamente la prima voce nel menù a tendina da joint hierarchy a Selected joints, visto che non voglio che il binding sia applicato a tutte le ossa dello scheletro.

A questo punto Ci basta muovere osso per osso e lavorare un po' di 'pesi'...soprattutto al livello di anche.Possiamo tralasciare le braccia per ora perchè stiamo per modificarle leggermente.

Un grosso problema riguarda le rotazioni sull'asse x(quello da osso ad osso per intenderci), in quanto è molto facile che la mesh 'collassi'...

Immagine inserita

Per ovviare a questo, stavolta useremo degli Influence objects...creeremo delle curve (di grado 1 sono più che sufficienti) che seguano esattamente i seguenti edge loops(basterà crearle 'snappando' i punti ai vertici della mesh(naturalmente, essendo pigro mi sono fatto uno script apposta).

Immagine inserita

le ho chiamate(da sx a dx) crv_L_Arm_Infl_0, crv_L_Arm_Infl_1, crv_L_ForeArm_Infl_0, crv_L_ForeArm_Infl_1, crv_L_ForeArm_Infl_2.

Selezioniamole e facciamo un Delete history, Center Pivot e Freeze transformations.

Per 'mirrorarle' dobbiamo tenere conto che le ossa della parte destra del nostro personaggio sono state create con il mirror joints, e quindi gli assi di rotazione sono invertiti, quindi dovremmo fare lo stesso con le nostre curve, quindi:

Selezioniamo le 2 curve del braccio e premiamo ctrl+g, ctrl+d, rinominiamo in g_crv_R_Arm_Infl e mettiamo -1 nel campo ScaleX.

Poi selezioniamo una delle PRIME curve e premiamo il tasto freccia in alto e facciamo un edit->Ungroup.

Selezioniamo le 3 curve dell' avambraccio e premiamo ctrl+g, ctrl+d, rinominiamo in g_crv_R_ForeArm_Infl e mettiamo -1 nel campo ScaleX.

Poi selezioniamo una delle PRIME curve e premiamo il tasto freccia in alto e facciamo un edit->Ungroup.

In questa maniera avremo eseguito un mirror anche degli assi delle curve.

Ora le aggiungiamo alla mesh con Skin->Edit smooth skin->Add influence...lasciamo DESELEZIONATO Use geometry e SELEZIONIAMO Lock weights con un default weight di 0.

Use geometry : SELEZIONATO significa che la mesh verrà influenzata anche dal movimento dei singoli elementi dell'influence object(es. i vertici), e per vederlo funzionare dovremo poi selezionare la mesh, andare agli INPUTS e, alla voce SkinCluster mettere ad ON Use components...DESELEZIONATO invece significha che la mesh verrà influenzata solo dalle trasformazioni relative all'oggetto(translate, rotate e scale), che è quello che interessa a noi ora.

Lock Weights : SELEZIONATO significa che il nostro influence obj. verrà 'skinnato' alla mesh con un valore di influenza stabilito dal campo successivo(nel nostro caso 0), DESELEZIONATO Maya lo 'skinnerà' come più gli piace, e in quasi nessun caso come vorremmo noi.

Una volta fatto questo, assegnamo un peso del 100% ai vertici 'sotto' le curve per la curva corrispondente.

Per quanto riguarda gomito e polso...seguiamo l'esempio fatto in precedenza(vedi fine della seconda parte)...il primo giro sarà al 100% con il joint a sx(j_sk_L_Arm_1,j_sk_L_ForeArm_1), il secondo giro avrà un 50 e 50, il terzo giro 100% al joint a destra(j_sk_L_Elbow, j_sk_L_Wrist).

Selezioniamo le 3 cuve dell'avambraccio, poi j_sk_L_Elbow e premiamo P, ora, ad ogni movimento del gomito le curve seguiranno.

Selezioniamo le 2 cuve del braccio, poi j_sk_L_Shoulder e premiamo P, ora, ad ogni movimento della spalla le curve seguiranno.

PER QUANTO RIGUARDA LA PARTE DESTRA:

non 'imparenteremo' le curve ma i gruppi, quindi: g_crv_L_ForeArm_Infl + j_sk_R_Elbow poi P,

g_crv_R_Arm_Infl + j_sk_R_Shoulder e poi P.

Ho creato un controllo 'fittizio' dove ho riunito tutto quello che mi serviva del braccio, e l'ho chiamato ctr_L_Arm, per ora gestirà la rotazione della nostra spalla.

Ora iniziamo a 'controllare' le nostre curve di influenza.

Ci interessa gestire la loro rotazione in X, quando ruotiamo il braccio e il polso.

Braccio : la spalla vuole ruotare, noi non glielo permettiamo ed invece distribuiamo la rotazione LUNGO il braccio...il gomito ruoterà degli stessi gradi della spalla, mentre le due curve avranno una rotazione distribuita, in questo caso io ho messo un terzo.

Questo e molti alti tipi di controlli possono essere sviluppati con delle espressioni, ma io quando posso preferisco usare gli utility nodes,in quanto le espressioni vengono eseguite sempre, mentre il calcolo dei nodes solo quando ce n'è bisogno, quindi si avrà un beneficio in velocità.

Dobbiamo sviluppare una cosa del genere:

crv_L_Arm_Infl_0.RotateX = ctr_L_Arm.RotateX / 3;

crv_L_Arm_Infl_1.RotateX = ctr_L_Arm.RotateX / 3 * 2;

Per prima cosa creiamo un utility node di tipo MultiplyDivide(dall'hypergraph o da dove volete voi), lo chiameremo md_L_Arm_Infl,

siccome potremmo incorrere in divisioni con lo 0, scegliamo di moltiplicare, quindi invece di fare /3 faremo *0,33 ecc...

Lo lasciamo selezionato ed insieme a lui selezioniamo ctr_L_Arm e le due curve di influenza del braccio, poi Window->Hypergraph input and output connections.

Ci troveremo di fronte a questa schermata

Immagine inserita

Ora trasciniamo con il tasto centrale ctr_L_Arm sopra md_L_Arm_Infl, rilasciamo, si aprirà un menu, scegliamo l'ultima voce: other...

Si apre il connection editor, espandiamo a sx il nodo Rotate, e a dx Input1, selezioniamo a sx RotateX e a dx Input1X e input1Y.

Ora trasciniamo con il tasto centrale md_L_Arm_Infl sopra crv_L_Arm_Infl_0, rilasciamo, other...

Se a sx non compare la voce Output, dal menu del connection editor Left display->Show non-keyable.

Espandiamo Output a sx e Rotate a dx, connettiamo OutputX a RotateX

Ora trasciniamo con il tasto centrale md_L_Arm_Infl sopra crv_L_Arm_Infl_1, rilasciamo, other...

Espandiamo Output a sx e Rotate a dx, connettiamo OutputY a RotateX

In questa maniera abbiamo detto al nodo md_L_Arm_Infl : prendi la rotazione in X di ctr_L_Arm, moltiplicala per 0.33 (1/3) e mettila nella rotazione X di crv_L_Arm_Infl_0, moltiplicala per 0.66 (2/3) e mettila nella rotazione X di crv_L_Arm_Infl_1.

Che è proprio quello che volevamo.

Mini riepilogo su come funziona il nodo MultiplyDivide:

scelgo l'operazione da fare(da attribute editor):

Nessuna, moltiplica, dividi, innalzamento a potenza...default moltiplica

esegui l'operazione tra Input1X e Input2X e metti il risultato in Output1X

esegui l'operazione tra Input2X e Input2X e metti il risultato in Output2X

esegui l'operazione tra Input3X e Input3X e metti il risultato in Output3X

Naturalmente se avessimo vettori potremmo utilizzare Input1, Input2 e Output.

Ora la situazione è la seguente:

Immagine inserita

Il gomito non l'abbiamo toccato qui perchè lo gestiremo tra poco.

Per quanto riguarda l'avambraccio(e quindi la rotazione X del polso) invece, faremo così:

Aggiungiamo un attributo di tipo vector a ctrl_L_Arm, chiamato Wrist, colleghiamo con il connection editor WristX a j_L_ForeArm_0.RotateX,

Creiamo un nodo MultiplyDivide (nome: md_L_ForeArm_Infl) con valori in Imput2 X,Y,Z 0.25 - 0.5 - 0.75 (stavolta dividiamo in quarti e non in terzi) poi colleghiamo(come abbiamo fatto prima) j_L_ForeArm_0.RotateX a md_L_ForeArm_Infl.Input1X,Y e Z.

Ora colleghiamo i 3 ouput rispettivamente a crv_L_ForeArm_Infl_0.RotateX, crv_L_ForeArm_Infl_1.RotateX, e crv_L_ForeArm_Infl_2.RotateX(ricordate, che nelle curve è sempre la X, mentre l'output è x,y e poi z...rispettate quest'ordine o ruoteranno in maniera sbagliata).

Immagine inserita

La rotazione mi sembra molto meglio, vero?

Immagine inserita

Ora non resta che connettere ctrl_L_Arm.RotateY con j_sk_L_Shoulder.rotateY e ctrl_L_Arm.RotateZ con j_sk_L_Shoulder.rotateY e con la spalla e il polso abbiamo finito(per ora)...pensiamo un attimo al gomito...aggiungiamo un attributo di tipo float a ctrl_L_Arm di nome Elbow e colleghiamolo a j_sk_L_Elbow.RotateY (l'unica rotazione che ci interessa del gomito).

Altra cosa facilissima, aggiungiamo un attributo di tipo vector a ctrl_L_Arm di nome Clavicula e colleghiamolo a j_sk_L_clavicula.Rotate (come vedete non ho definito X,Y o Z perchè collegheremo il nodo principale dei due vettori).

Rilassiamoci un attimo con le gambe...

Gestiremo le gambe con un semplice ikRPSolver, comodo, facile, veloce e che va benissimo, e per i piedi, io non amo molto la tecnica del reverse foot, quindi la gestiremo con altre IK(mi sembra che ce ne sia un esempio già qui su treddi, lo rispiegherò a mia maniera, come lo capite meglio....meglio per voi melius abundare quam deficere, no?).

Prima di creare un IK, dobbiamo fargli trovare pronta una cosina...il senso in cui dovrà far ruotare le nostre ossa...se io creo una semplice catena di 3 joints, uno in linea con l'altro, e ci costruisco un IK, muovendo l'handle non succederà niente(o quasi), perchè?

Perchè l'IK non sa in quale piano dovrà ruotare l'ossatura...dobbiamo dirglielo noi, e come?

selezioniamo le due ginocchia e ruotiamole un po' in X nel verso in cui si piega il ginocchio, non è importante quanto, giusto un po'

Immagine inserita

tenendo premuto il tasto dx prima su un ginocchio poi sull'altro, nel popup che appare scegliamo Set preferred angle, dopodichè possiamo rimettere la rotazione a 0

Creiamo 3 IK handles Anca-caviglia, caviglia-ball e ball-toe e chiamiamole IK_L_Ankle, IK_L_Ball e IK_L_Toe.

Togliamo ogni selezione e premiamo ctrl+g, poi premiamo due volte ctrl+d, abbiamo creato tre gruppi vuoti, chiamiamoli g_L_Ankle, g_L_Ball e g_L_Toe.

Ora snappiamo i gruppi in 'ordine inverso', nel senso il gruppo ankle sul joint toe, ball su ball e il gruppo toe sul joint ankle, facendo poi un freeze transormations.

Mettiamo IK toe nel gruppo toe, le altre due IK nel gruppo ball e i due gruppi nel gruppo Ankle.

Immagine inserita

Ora creiamo i controlli per le gambe...semplicissimi, due curve per i piedi e due per i pole vector, quello che volete...

Il controllo per il piede deve avere il pivot point alla caviglia, quello per il pole vector va snappato al ginocchio e poi spostato in avanti lungo il solo asse z...appena pronti, delete history, e freeze transformations.

Li chiameremo ctrl_L_Leg e ctrl_L_Leg_Pv.

Immagine inserita

Ora attiviamo i pole vector selezionando prima ctrl_L_Leg_Pv poi IK_L_Ankle e scegliendo Constrain->Pole vector.

Quello che dobbiamo fare ora è selezionare ctrl_L_Leg_Pv e premere ctrl+g e chiamare il gruppo g_L_Leg_Pv, sempre con il gruppo selezionato, premiamo w (il move tool) e il tasto insert, in modo che possiamo snappare il pivot point del gruppo direttamente sul joint della caviglia senza spostare niente e rimanendo con tutti i valori a 0.

Fatto questo selezioniamo ik_L_Ankle, poi g_L_Leg_Pv e creare un point constraint, in questo modo quando sposterò il piede, il pole vector si muoverà insieme e non dovrò corrergli dietro per tutto lo schermo, in più, avendo fatto il constraint sul gruppo, potrò sempre muovere il mio controllo.

Se osserviamo il nostro piede, quando lo ruotiamo a dx e sx tenendo la pianta a terra, ruota anche il ginocchio, quindi creiamo una connessione tra ctrl_L_Leg.RotateY e g_L_LegPv.RotateY.

Ora semplicemente imparentiamo g_L_Ankle a ctrl_L_Leg, e la nostra gamba è a posto.

Adesso  possiamo selezionare le IK e premere ctrl+h per nasconderle, non ci serviranno più.

Ancora più semplice...Creiamo un bel cerchio e chiamiamolo ctrl_Root, snappiamolo al nostro j_sk_Root e scaliamolo in modo che si possa vedere con la mesh visualizzata, soliti delete history e freeze transformations, infine o facciamo un parent constraint controllo + root joint, oppure un semplice point constraint e colleghiamo la rotazione del controllo a quella del joint, io per questa volta ho scelto la seconda soluzione.

Immagine inserita

Immagine inserita

Creiamo ora un attributo di tipo vector chiamandolo Hips e connettiamolo alla rotazione di j_Hips_Root.

Immagine inserita

Ora un controllo per la spine, creiamo un cerchio, ruotiamolo faccia al pupetto e portiamolo dietro la schiena, modelliamolo un po' e spostiamo il suo pivot point nella parte bassa, chiamiamolo ctrl_Spine, poi tenendolo selezionato premiamo ctrl+g e chiamiamo il nuovo gruppo g_ctrl_Spine, snappiamo il suo pivot point su j_sk_Spine_0 e facciamo un PARENT constraint selezionando prima j_sk_Spine poi il gruppo.

Immagine inserita

Colleghiamo ora ctrl_Spine.Rotate ai rotate di tutte le ossa della spine.

Immagine inserita

L'ultimo controllo semplice...gli occhi...Ci sono vari modi di 'riggare' gli occhi, in base anche al tipo di movimento che gli vogliamo far fare...ad esempio potremmo voler muoverli anche indipendentemente, per un personaggio stile cartoon...non è il nostro caso per ora.

Un metodo è quello di creare un controllo e un aim constraint agli occhi, in modo che guardino sempre verso il controllo...ma dovremmo sempre ricordarci di spostarlo ogni volta che il nostro personaggio si muove, e sinceramente..non mi va...anche perchè a chi guarderà la nostra animazione, non è l'esatta posizione degli occhi che colpisce, ma è l'impressione che dà la direzione in cui puntiamo lo sguardo...quindi facciamo così:

creiamo un controllo(un triangolo ad esempio)e snappiamolo al nostro j_Eyes, poi spostiamone il pivot point su j_HeadEnd, chiamiamolo ctrl_Eyes(ma va'...), delete history, freeze transformations e point constraint a j_Head_End.

Ma...un momento...i nostri occhi ancora non sono collegati al nostro scheletro....facciamolo subito...creiamo un joint e chiamiamolo j_L_Eye, snappiamolo al nostro occhio sx...naturalmente potevo non avere io uno script per lo snapping? ma se voi non ce l'avete, fate così...selezionate l'occhio, poi il nuovo joint e create un point constraint(naturalmente tra le opzioni del point constraint dovete avere il campo Mantain offset DESELEZIONATO...poi selezionate il POINT CONSTRAINT che avete appena creato e cancellatelo...ora selezionate il joint e imparentatelo al nostro j_Eyes, dopodichè fate un parent constraint dell'occhio sul nuovo joint.

Poi selezionate ctrl_Eyes, quindi j_L_Eye ed eseguite un parent constraint.

ora, ruotando il controllo, ruoteranno anche i nostri occhi(i miei no, ma quelli del pupetto si).

Immagine inserita
Immagine inserita

Immagini allegate

  • Image_01.jpg

Messaggio modificato da nicolce il 14 settembre 2009 - 10:47






0 utente(i) stanno leggendo questa discussione

0 utenti, 0 ospiti, 0 utenti anonimi