Stretchable Ik Spine

Schleifer-spine

Deze setup is bedacht door Jason Schleifer, onder andere bekend als developer van Alias en zijn werk bij de productie van Lord of the Rings. Jason heeft veel van zijn methodes uitgegeven op DVD’s en geldt als maatgevend op het gebied van rigging in Maya.
De Schleifer-spine is stretchable, de methode die gebruikt wordt, maakt goed gebruik van Maya’s Dependency Graph. Dat wil zeggen dat de berekeningen voor de spine slechts gedaan worden wanneer er een waarde verandert. Door utilities zoals Multiply-Divide te gebruiken in plaats van expressions ( die constant rekentijd opeisen), wordt er zuinig omgesprongen met resources.

Vereenvoudigde setup

In dit voorbeeld gebruik ik slechts 5 joints, waar ik in de meeste gevallen 9 tot 12 joints zou gebruiken. hetzelfde geldt voor de curve van de Spline Ik, daarbij zou ik liefst 6 CV’s ( 3 spans) gebruiken met 3 clusters. Nu gebruik ik een curve met 4 CV’s (1 span) en 2 clusters. Het gaat hier om het idee en om de handelingen enigzins  te beperken.

Het eerste gedeelte van de setup is gelijk aan die van de Basic spine, tot en met het aanbrengen van de control objects. Hier volgen de stappen in het kort, kijk bij het artikel Basic Ik-spine voor meer uitgebreide uitleg.

  • Teken 5 joints met de Joint Tool in een Side View van onder naar boven. Plaats de joints op ongeveer gelijke afstanden.
  • Klik met de Ik Spline Handle Tool eerst op joint1, dan op joint5, de splineIk handle  en de spline worden gemaakt.
  • Selecteer  de eerste 2 CV’s van Curve1 en maak een cluster door Animation:Create Deformers-> Cluster. Doe hetzelfde met de bovenste 2 CV’s
  • Maak 2 CTRLcurves aan en zet er een bij de bovenste joint en een bij de onderste joint. Zet ook de Pivot in de buurt van de joints. Freeze Transformations op beide curves.
  • Connection Editor laad links CTRLcurve1 en rechts clusterHandle1. Verbind translate met translate en rotate met rotate. Herhaal voor CTRLcurve2 en clusterHandle2.

De curveInfo Node

De curveInfo Node is een niet alledaagse node die je in Maya kunt gebruiken. Deze node berekent de lengte van een curve.  De node hoeft alleen aangemaakt te worden en verbonden worden met desbetreffende curve. Voor het aanmaken typ je op de Commandline:

CreateNode CurveInfo

Denk erom dat je hoofd en kleine letters correct ingeeft. Als het commando goed getypt is krijg je deze melding:

Result: CurveInfo1
Voordat je iets anders doet:

  • Open de Connection Editor en druk op reload right.

Mocht je de selectie van CurveInfo1 kwijt zijn, typ dan in de Commandline:

select -r curveInfo1

Nu de curve van de splineIk selecteren, pickwalk (pijltjestoets) 1 node naar beneden, zodat curveShape geselecteerd is.

  • Laden in de Connection Editor, reload left.
  • Connect worldspace[0] aan input curve

We kunnen nu een scalefactor construeren door de veranderende lengte van de curve te delen door de oorspronkelijke lengte van de curve. In de beginsituatie levert dat 1/1=1 op. Vergroten levert een getal groter dan 1 op, en verkleinen een getal kleiner dan 1.

De scalefactor

Deze scalefactor zou je moeten vermenigvuldigen met de scaling van elke joint, zodat er stretching optreedt. Om precies te zijn is het de X-scaling van de joints, in maya wijst de locale x-as van elke joint naar de volgende. Om redenen van compatibiliteit met mocapsystemen, die geen scaling kennen en alleen maar werken met translaties, heeft Jason Schleifer gekozen om niet de ScaleX te gebruiken, maar de translateX. Met translateX kun je joints ook langer of korter maken.

  • Allereerst de voor scalefactor gebruik je een Multiply-Divide node. Deze is te vinden in de Hypershade onder Create Utilities.
  • Rename deze multiply-divide in scaleF en zet Operation op Divide.
  • Sleep vanuit de Outliner curve1 naar de workarea van de Hypershade.
  • Druk op het icon in- en output connections. Schrik niet van de wirwar aan nodes, maar zoek de curveinfo node.
  • Middlemouse drag en drop deze op de scaleF (met shift). Hierbij wordt de connection editor geopend met de goeie dingen links en rechts.
  • Nu kun je ArcLength verbinden met input1X. Met een multiply-divide kun je berekeningen doen op getallen met 3 waarden. In dit geval maar 1 waarde, gebruik daarvoor alleen inputX1, inputX2 en outputX
  • Vul bij input2X de originele ArcLength in, deze is nu hetzelfde als bij input1X, alleen deze waarde is statisch

De scalejoint multiply-divide

De scaleF houdt bij hoe de lengte van de curve verandert door de actuele ArcLength te delen door de beginwaarde van ArcLength. Dit getal zou je moeten vermenigvuldigen met de actuele translateX waardes van elke joints en stretching is een feit.
Voor het vermenigvuldigen wordt hier ook een Multiply-Divide Node gemaakt, ditmaal voor elke joint 1, met als operation multiply.
De input wordt dan translateX en scalefactor. Deze worden vermenigvuldigd, de output waarde wordt dan verbonden met de translateX-waarde van de joint.

  • Maak nog een multipy-divide in de Hypershade en rename deze scalejoint1.
  • Dupliceer deze (ctrl+D) vier keer. Laat operatie op multiply.
  • Shift Drag’n Drop scaleF op scalejoint1. Connect output1X aan input1X.
  • Selecteer scalejoint1 en vul de actuele translateX van joint1 in bij input2X in de attribute-editor.
  • Sleep joint1 vanuit de Outliner naar de Hypershade.
  • Drag en drop (met shift) scalejoint1 op joint1, connect output1X met TranslateX.
  • Doe hetzelfde met de andere vier scalejoint multiply-divides.
  • Test de stretch door de CTRLcurves te bewegen.

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s