stretchy IK mit damping und free/fix elbowvon Florian Linner | |||||||
|
|||||||
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
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).
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.
|
<< zurück << | >> weiter >> |