Jump to content
Sign in to follow this  
couch

Offset Bone Animation in a KineFX Rig

Recommended Posts

I am working on a simple Kine FX rig and would like to control the tail of an animal by keyframes of a single bone. The animation of the first bone should be transferred to the other bones with a time delay. I have tried to transfer the techniques shown here to my rig:

https://www.tokeru.com/cgwiki/index.php?title=HoudiniChops#Stagger_and_offset_bones

but unfortunately, I fail to import the channels of the rigpose Node to a Chops Network and link all the rotation values there.

Does anyone have a tip for me on how best to go about this?

Share this post


Link to post
Share on other sites

With kineFX a lot of the CHOPs workarounds aren't really necessary anymore.

The stupid simple way to do that is once you've made your tail skeleton, add a pose rig node. With the pose rig node selected, hit enter in the viewport to fire the state and select all the tail joints so their transformations get loaded into the pose rig node.

Now just copy the rotation attributes of the base joint and paste relative reference into the rotation parameters of all the other joints. Whatever rotation to make to the base joint will now get added to each joint as well as the parent transform and you'll get curling like in the tutorial above.

You can also do it in a rig VOP, but it's a little more work to set up.

Finally, you might want to search for "kineFX curve IK" and you'll find a bunch of tutorials on setting up spine IK tails, which I generally prefer to this tail set up. But both are valid as options.

Share this post


Link to post
Share on other sites

Thanks for your help, but how would I integrate an automatic time offset? The rotation x of bone 2 should take place 2 frames later than the rotation X of bone 1 and so on.

Chops_bones_final.gif

I wanted to avoid Curve IK because I have a lot of tails in my scene. And my plan would have been to control all of them with only the first bone of each chain. These animations should then be transferred to the remaining bones with a time delay.

Share this post


Link to post
Share on other sites

Circling back to this because part of it was bugging me.

I mentioned before there's a few ways to do this.

-- You can just do it simply with expressions in a rig pose node.
-- You can do it in a rig VOP, although note that the rig VOP has been changed from Detail to Points. In Detail mode (the way a rig VOP is supposed to work) you can get all the point transforms and then in a for each point transform loop you can offset the rotation. But this doesn't do what you think. Instead, if you set the VOP to run over points, it works the way you expect it to.

-- Finally you can do the same thing in a wrangle. EXCEPT, you have to make sure to offset the localtransform (the transform relative the parent) and not the world transform. AND you have to use the "prerotate" command, not the "rotate" command. This mirrors the pre-multiply and post-multiply options on the rig pose. I don't fully get it, honestly, but it's a bit like shifting between local and world space transforms.

-- And lastly I added a simple time offset. For simplicity I'm just adding the same rotation and time offset to each joint, not what you show in the example. But it should be easy to adapt this so each joint has its own controls like in the examples above.

Its a seemingly simple thing to do, but getting it to work is useful to understand how the various transform attributes are used under the hood by kinefx and the rig pose node. Hope it's useful.

 

tail_v01.hipnc

  • Like 1

Share this post


Link to post
Share on other sites

I came back to this working on another problem. It's simple, but deceptively tricky, and is really useful for understanding how kinefx uses the world transforms and local transforms and how to go about manipulating them since the rig VOP, in particular, is a bit counter-intuitive.

So in addition to the above, I also updated:

-- A rig VOP running in its "proper" detail mode. It uses a for-each loop to add in the rotation of the first joint to each child joint using the very handy "Get Descendant Transforms" VOP. You can also use a for-each transform loop, but you have to hack it a bit to get access to the rotation of the first joint inside the loop.

-- In addition to the Rig Wrangle driven by a value, I added a version driven by the rotation of the first joint. I cheated a little here by manually setting the loop to run over the child points only.

-- And finally, I added a version that has a recursive FK rig where each joint's rotation is added to all its child's joints. This is a pretty common setup in other programs, but took a bit of work to get it functioning as expected. It's not a production-ready set up, but it has the functionality.

tail_v03.hipnc

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×