stretchy IK mit damping und free/fix elbow

von Florian Linner

<< zurück <<

stretch

>> weiter >>

Wir fangen mit einer Szene an, die nur aus einer Joint-Kette mit 3 Joints besteht, welche A,B und C heißen und einem damit verbundenen einfachen ikHandle mit ikRPSolver, and den ein Locator, der pole heißen soll, poleVectorConstraint ist.

Zuerst fügen wir auto-stretch hinzu. Das machen wir in diesem Beispiel über translate, aber wenn ihr der Meinung seid, dass stretching besser über scaling funktioniert, könnt Ihr es ruhig auch so machen.

Wenn der Arm (odere was auch immer) also gerade ist, wollen wir anfangen zu stretchen, davor sollen die Joints ihre ursprüngliche Länge beibehalten. Das bewerkstelligen wir, indem wir die ursprünglichen tx-Werte der Joints B un C mit einem Faktor multiplizieren, der größer als 1 ist, wenn der Arm gerade ist und 1, wenn der Arm geknickt ist.

Dazu verbinden wir multiplyDivide-nodes mit den x-Werten der Joints hinzu und setzen input2X auf ihren ursprünglichen Wert. Wir nennen sie md1 und md2

Dann messen wir die Distanz zwischen start- und end-Handle (nicht zwischen den Joints,da wir sonst einen Cycle bekommen) indem wir einen distance-between-node benutzen und wenn seine distance größer als die ürsprüngliche Gesamtlänge der Joints ist (AB+BC), fangen wir an zu stretchen
Dazu fügen wir einen multiplyDivide-Node hinzu, um den Prozentsatz der Distanz gegenüber der Gesamtlänge zu bekommen und nennen ihn AC_percentage. Verbindet die distance des distanceBetween-Nodes mit input1X von AC_percentage. Setzt input2X auf die Gesamtlänge AB+BC (also B.tx+C.tx). Setzt operation auf Divide.

Nun müssen wir die Bedingung setuppen (oder upsetten?:)), die definiert, wann wir anfangen zu stretchen. Wir könnten das mit einem condition-Node machen, aber wir benutzen lieber eine driven-key-curve, da wir eine solche auch später für den damp-Effekt brauchen.

Die Kurve bekommt also ihren input von der distance von AC_percentage und ihr output geht in input1X von md1 (und auch md2).
Da wir wollen, dass nichts passiert, bis die distance die Gesamtlänge erreicht hat (AC_percentage = 1.0) setzen wir den erstenKey dort (1.0/1.0).
Von da aus wollen wir linear stretchen. Also setzen wir noch einen Key bei z.B. (1.1/1.1) und setzen die post infinity auf linear.
Benennt die Kurve in stretch_percentage_nodamp um.

Jetzt funktioniert das auto_stretch schon. Jetzt müssen wir nur noch ein Attribut auf dem end_handle damit verbinden, damit wir es ausschalten können und dann haben wir's geschafft. Also fügen wir ein Attribut, das wir auto_stretch nennen, zum end_handle hinzu, welches von 0 bis 1 geht. Dann erstellen wir zwei blendTwoAttributes-Nodes und nennen sie stretch_dial1 und stretch_dial2. Setzt input[0] von stretch_dial1 auf den ursprünglichen tx-Wert von B und input[0] von strech_dial2 auf den ursprünglichen tx-Wert von C.
Das sind die Werte, die die Joints bekommen sollen, wenn auto_stretch ausgeschaltet ist.
Jetzt müssen wir diese blend-nodes zwischen die mds und die x-Werte der Joints schalten. Verbindet die outputs von md1/md2 mit dem input[1] der stretch_dials.
Verbindet -force den output der blend-Nodes mit den x-Werten von B/C. Verbindet das auto_stretch-Attribut mit dem attributesBlender.

<< zurück <<

>> weiter >>