FK Hand | Mayastudent
De vingers van de hand bewegen voornamelijk in de drie laatste segmenten. De laatste twee segmenten zijn scharniergewrichten, en kunnen maar één kant op draaien. De knokkels van de vingers en de root van de duim zijn gewrichten die over twee assen kunnen roteren; vingers kunnen behalve krullen, ook spreiden.
Anatomisch valt erover de hand te zeggen, wanneer de hand in een natuurlijke ontspannen stand staat, bij voorkeur de gemodelleerde pose, dan staan de vingers licht gebogen, enigszins uit elkaar. Wanneer we vanuit deze pose een vuist maken, komen de vingers bijeen.
De duim staat in een hoek van 45˚ ten opzichte van de wijsvinger van bovenaf gezien, en in een hoek van ongeveer 30˚ vanaf de zijkant gezien. De positie van de duim eindigt een stuk lager dan de rest van de hand.
de beginpose van de hand
Allereerst maak een losse joint, plaats deze op de pols en noem deze handjoint.
Nu maak ik voor elke vinger een chain van 5 joints die begint in de buurt van de handjoint en eindigt in de vingertoppen.
De duim heeft 4 joints.
Voor de rig is het belangrijk dat alle joints de goede namen krijgen: bv thumbjoint1, thumbjoint2, indexjoint1, etc.
Al je exact dezelfde namen als in deze tekst, kun je de expressies kopiëren.
Let erop bij het plaatsen van de joints, dat alle rotaties 0 blijven. Gebruik alleen translaties bij het plaatsen!
Het volgende punt van belang is de oriëntatie van elke joint. Zorg ervoor dat elke local axis, de X-as naar het verlengde van de vinger wijst, de Y-as naar boven, en de Z-as naar de voorkant van het model. Het model staat (natuurlijk) met het gezicht naar de positieve Z-as in de wereld.
Gebruik de rotatietool in component mode, klik op het vraagtekentje bij selection masks in de Statusbar om de local axis' zichtbaar te maken. Kijk goed vanuit verschillende richtingen. De endjoints hoeven niet georiënteerd te worden.
Orienteer de handjoint eveneens met X in de richting van de hand.
oriëntatie van de joints in de hand
Parent alle vingers onder de handjoint, we zien automatisch bones verschijnen tussen de handjoint en de vingers.
Omdat we met links en rechts te maken hebben, selecteren we nu de handjoint en gaan naar Modify->Prefix Hierarchy Names en gebruiken desgewenst L_ of R_ als prefix.
Maak een NurbsCircle met normal axis in X.
Delete history en groep deze in zichzelf.
Noem de circle handCTRL en de groep handCTRLgrp.
Parent Constrain de handCTRLgrp aan de handjoint. Zet in de optiebox maintain offset uit.
De handCTRL staat nu met nulwaarden op de juiste plaats. Een ander voordeel is, dat de control nu met de hand meebeweegt.
Maak nu voor elke vinger een curve
Plaats deze boven de hand op voldoende afstand om niet in het gedrang te komen met geometrie en bones.
Doe een center Pivot, en zet de pivots aan het begin van elke curve.
Doe een Freeze Transform en parent de curves onder handCTRL.
Geef de curves de juiste naam: thumbCTRL, indexCTRL, middleCTRL, ringCTRL en pinkCTRL.
Nu gaan we de attributes te lijf. Eerst maken we alle bestaande attributes non-keyable in Channel Control.
Dan maken we met Add Attributes de juiste attributes aan, volgens de tabel, let erop dat het type float is.
Control Attribute Minimum Maximum Default
handCTRL spread -5 10 0
index -10 60 0
middle -10 60 0
ring -10 60 0
pink -10 60 0
thumb -10 60 0
liftThumb -20 20 0
thumbCTRL root – – 0
knuckle – – 0
tip – – 0
index\middle\ring\- knuckle – – 1
pinkCTRL first – – 2
second – – 1
spread – – 1
Nu hoeven we alleen nog de attributes van de controls te verbinden met de rotaties van de vingers. In principe is de expressie een vermenigvuldiging van de waarde van de atttributes van de handCTRL, die een soort van mastervolumeknop is, met de attributes van de vingerCTRLs, zij geven de hoeveelheid beweging per gewricht.
De expressies van de vingers komen op de rotate Z en Y van de vingerjoints, die van de duim op rotate Y en Z. Als je naamgeving hetzelfde is kun je de expressies copy-pasten.
De expressies voor krullen en strekken:
L_indexjoint2.rotateZ=(L_handCTRL.index*LindexCTRL.knuckle)*-1;
L_indexjoint3.rotateZ=(L_handCTRL.index*LindexCTRL.first)*-1;
L_indexjoint4.rotateZ=(L_handCTRL.index*LindexCTRL.second)*-1;
L_middlejoint2.rotateZ=(L_handCTRL.middle*LmiddleCTRL.knuckle)*-1;
L_middlejoint3.rotateZ=(L_handCTRL.middle*LmiddleCTRL.first)*-1;
L_middlejoint4.rotateZ=(L_handCTRL.middle*LmiddleCTRL.second)*-1;
L_ringjoint2.rotateZ=(L_handCTRL.ring*LringCTRL.knuckle)*-1;
L_ringjoint3.rotateZ=(L_handCTRL.ring*LringCTRL.first)*-1;
L_ringjoint4.rotateZ=(L_handCTRL.ring*LringCTRL.second)*-1;
L_pinkjoint2.rotateZ=(L_handCTRL.pink*LpinkCTRL.knuckle)*-1;
L_pinkjoint3.rotateZ=(L_handCTRL.pink*LpinkCTRL.first)*-1;
L_pinkjoint4.rotateZ=(L_handCTRL.pink*LpinkCTRL.second)*-1;
Er zit nog een extra -1 multiplier bij; dat komt door de negatieve Z-rotatie die we niet als zodanig in onze control willen doorvoeren.
Test de beweging door met de handCTRL de attributes index t/m pink te sliden. Slide de vingers in gekrulde positie. Ga nu naar de individule vingers en verander daar de waarden voor het verkrijgen van andere handposes.
De expressies voor het spreiden van de vingers:
L_indexjoint2.rotateY=L_handCTRL.spread*LindexCTRL.spread;
L_middlejoint2.rotateY=L_handCTRL.spread*LmiddleCTRL.spread;
L_ringjoint2.rotateY=L_handCTRL.spread*LringCTRL.spread;
L_pinkjoint2.rotateY=L_handCTRL.spread*LpinkCTRL.spread;
Het testen en tunen van de beweging: Zet spread bij handCTRL op 10. Selecteer nu de pinkCTRL en zet de spread daar op een waarde zodat de pink naar buiten spreidt. Doe hetzelfde bij de ringCTRL. Nu bij de volgende twee vingerCTRLs wordt de waarde negatief bij spread. Ga nu weer naar spread in de handCTRL en slide de waarde heen en weer om de de spread te testen.
De expressies voor de duim:
L_thumbjoint1.rotateY=L_handCTRL.thumb*LthumbCTRL.root;
L_thumbjoint2.rotateY=L_handCTRL.thumb*LthumbCTRL.knuckle;
L_thumbjoint3.rotateY=L_handCTRL.thumb*LthumbCTRL.tip;
De expressies voor de duim zijn vergelijkbaar met die van de vingers, alleen is het geen Z-rotatie, maar een Y-rotatie. De root zorgt voor het vouwen van de hand. De andere twee gewrichten doen doorgaans minder. Test de verschillende bewegingsmogelijkheden.
Als laatste verbinden we in de Connection Editor handCTRL.liftThumb aan de rotateZ van thumbjoint1. De op en neer beweging van de duim is op zichzelf staand en komt voort uit de root van de duim, vandaar de directe connectie.