TUTORIAL: Tips for working with ikSplineHandles (Maya)


Splinehandles are very good for controlling the back, but also for making other parts cartoony (for example the fingers or the arms).




first Tip:
rotation over the length-achse

The usual way of creating the splineHandle is - after placing the bones and creating the SplineHandle - making a cluster of each point of the splineCurve and then using the clusters to controll the curve.

I`m using this method as well. But there is one thing, that you should know: with the curve (or the clusters) you can controll any movements and some rotations, except: the rotation of the twist-achse. If you twist the curve, the joints will not twist with the curve (they will move a bit, but...)
You have an attribute called "roll" in the ikHandle. But I recommend you, NOT to use it, as there is a simplier way:
put all the joints of the splineHandle AND the curve (or the controlls) in the hierarchy under one object (mostly another joint) and with this object, you can rotate it, and if you made everything correct, it`ll work!

 






another Tip: combining splineHandle with ForwardKinematics

Many animators say: "Don`t give me a splineHandle for the back, I only animate in FK!"
Actually, a splineHandle is an IK-feature, but you can combine ikSplineHandle with FK-joints.
Just make an ikSplineHandle with many Joints and one joint-chain (that you use for FK-rotation) with less joints that are lying as exactly as possible on the small splineHandle-joints. Take the curve, that you got from the splineHandle and create clusters of it.
Parent each cluster to the closest joint in the FK-chain.
FINISHED... now you can make some controll-objects for your FK-chain.





another Tip: Twisting from the root (bottom)

in the splineHandle there is a parameter called "Twist". With this parameter you can twist the joints, so that the rotation of the first (at the root) is zero, and the more they go up, at the tip they have the rotation of the Twist-Parameter.
But there is no Parameter for reverse-twist. So that at the tip, there is twisting of zero, and at the root the twist that we want.
No problem for us. Here comes the solution:
We make a controll called "rootTwist" (a curve, poly or whatever... has to be aligned to the world-achses), that we want to use for this twisting and put it at the root of the curve (at the joint, that is at the bottom). On this rootTwist we parent the curve or all the controlls that we created for the curve. So - when you rotate or translate this rootTwist now, the whole splineHandle with the joints should translate correctly with it. and when you rotate it at the world-y-achse, it rotates.
Now the point of this solution: We let the "Twist"-Parameter of the ikSplineHandle rotate reverse to rootTwist, so that the joint at the Tip doesn`t seem to rotate anymore.
(ikHandle.Twist = rootTwist.rotateY * -1 ... you can do this with expressions or shadingNodes)




another Tip: scaling the Joints in relation to the curve.


after the first time using ikSplineHandle, you may have noticed, that - if the curve gets longer, the joints stay in the old length.
No problem for us!
Here the solution:
We just ... scale the joints. Or - in order to prevent the "reverse Translation" which is explained in the tutorial "autoScaling Joints" - we translate them.
We have to caluculate the new ScaleX (or TranslateX) with the original length of the curve and the new length. For getting the length, we create a curveInfo-Node. I didn`t find a button for it yet (and I don`t think there is one). So - type: arclen -ch 1
Now we got a curveInfo-Node. Then we create a multiplyDivideNode, which we use for dividing the length by the old length. For this just connect Length from the curveInfoNode to InputX1 of the multiplyDivideNode and set the Parameter Input2X to the length (so that the values of Input1X and Input2X are the same, just Input1X is a connection. Now set Operation of the multiplyDivideNode to Divide and connect the OutputX of the multiplyDivideNode to the scaleX-Parameter of each joint of the ikSplineHandle. Finished! If you want to controll the TranslateX rather then ScaleX, you have to create another multiplyDivideNode for each joint, in which you multiply the scalefacter (from the first mdNode) with the old translateX. So you end up with having a lot of multiplyDivideNodes... except if the translateX-parameter of each Joint is the same, then you only need one extra Node.