Awesome Spine Setup

“Awesome Spine” Setup

A few people have showed interest in how I create what I call the Awesome Spine. So here is my tutorial. I hope you enjoy it. Click on the images to make them larger.
  1. Create a spine with 5 joints like Figure 1. and orient the joints correctly.

    Figure1

    Figure1

  2. Name the joints to avoid future confusion. I named the first set Spine_#_ik, replace the hash with a number. Duplicate the all the joints and rename them Spine_#_bind. See Figure 2.
  3. Duplicate the spine_1_ik and duplicate it again so you have two joints. Name them hip_joint, shoulder_joint respectively. Snap the shoulder_joint to the top spine joint.
  4. Now create an splineIK from spine_1_ik to spine_6_ik, with the attributes in Figure 3.
  5. Now select the spine_curve, hip_joint, and shoulder_joint. We are going to smooth bind these joints to the splineIK curve. Skin->Bind Skin->Smooth Bind. Use the selected joints and default settings for the rest. The hip and shoulder joints now control the spine. This is awesome because now we have independent control of the shoulder and hips. By rotating either joint we can get nice curves quickly. The only thing it can’t do yet is twist down the length of the spine. This is what we are going to spend the rest of the tutorial setting up.
  6. Create ikRPSolver for each joint in the spine_#_bind joints. A quick way of doing this is to go to Skeleton->IK Handle Tool-> optionBox and selecting the spine_1_bind, then shift-select spine_2_bind. Repeat for the rest of the joints. Figure 4 shows an ikRPSolver at each joint. The reason for applying the ikSolvers at each joint is so that we can have individual control of the twist at each joint.

    Figure2

    Figure2

  7. Parent each ikHandle to the respective parent + 1. what I mean by this is look at where the first ikHandle is. It located at the second joint in the bind chain, so parent the first ikHandle to Spine_2_ik, and so on. Also, you will need to point constraint the spine_1_bind to the spine_1_ik. so select spine_1_ik and shift-select spine_1_bind and click point constraint. Now if you move the hip or shoulder joints the spine_#_bind spine will follow.
  8. Create 5 locators. Exactly the number of ikHandles we have. Snap them to each joint, except the last one, and move it a few units from the spine. See Figure 4
  9. Create an empty group and snap it to the first joint in spine_#_bind. Then Parent the first locator to
    figure3

    figure3

    the group. Do this for the rest of the locators. Now if you rotate the group along the twist axis of the spine it will rotate the locator around the spine. This is exactly the behavior we want. See Figure 5 for a snap-shot of what the locators and groups look like.

  10. Now select the first locator, and shift_select the first IKhandle and click pole vector constraint. Do this for all the locators and ikHandles. This is what will control the twist of the spine.
  11. Once all the locators are grouped parent the groups to the corresponding spine_#_ik joint. Now since the twist axis of the spine joints is the X-Axis, we need to select the all the groups we just parented
    figure4

    figure4

    and Freeze Transformations. Now the groups will rotate about X and orbit the locators around the spine. You can see this better if you select all the spine_#_bind joints and turn on the Local Rotation Axis, Display->Transform Display->Local Rotation Axis. Figure 6.

  12. Now we are going to distribute the twist equally along the spine. Open up the HyperShade. And drag the hip_joint, shoulder_joint, and the locator groups into the HyperShade. This part might get kind of confusing, that’s why I am including a large picture of my HyperShade (figure 7) so you can see how I connect the nodes. But I will still try my best explain.
  13. I first created a plusMinusAverage node, known from now on as a pma. Name it spine_3_pma. With the attribute editor I changed it from Sum to Average. I connected the rotateX of the hip_joint to the
    figure5

    figure5

    input1D[0] of the pma. Then I connected the rotateX of the shoulder_joint to the input1D[1] of the pma. I connected the output1D of the pma to the locator3_grp.rotateX. Now if you rotate the shoulder_joint 100 degress in rotateX, locator3_grp will have rotated 50 degrees.

  14. Now move on to locator2_grp. Create another pma. Name it spine_2_pma. Connect the output1D of spine_3_pma to the input1D[0] of spine_2_pma. Then connect the hip_joint.rotateX to the input1D[1] of spine_2_pma. Connect the output1D of spine_2_pma to locator2_grp.rotateX. With the shoulder_joint still rotated 100 degrees, the locator2_grp will now be rotated 25 degrees.
  15. Create another pma, name it spine_1_pma. Connect the hip_joint.rotateX to spine_1_pma.input1D[0].
    figure6

    figure6

    Connect the spine_1_pma.output1D to locator1_grp.rotateX. We want locator1_grp to only get its rotation from the hip_joint. This seems like a waste of a utility node, but I included it for organization and so the HyperShade would make more sense.

  16. Create another pma, name it spine_4_pma. Connect the spine_3_pma.output1D to the spine_4_pma.input1D[0]. Connect shoulder_joint.rotateX to spine_4_pma.input1D[1]. Connect the spine_4_pma.output1D to locator4_grp.rotateX.The locator4_grp should now have a 75 degree rotation.
  17. Create another pma, and name it spine_5_pma. Connect the shoulder_joint.rotateX to the spine_5_pma.input1D[0]. Connect the
    The HyperShade setup for the twist.

    figure7

    spine_5_pma.output1D to locator5_grp.rotateX. Don’t forget to

    figure8

    figure8

    change each plusMinusAverage node to “Average” instead of “Sum”.

  18. If we did everything right this is what it should look like Figure 8. Twist both the hip and shoulder_joint around to see how it works. It definitely twists past 180 without flipping.
  19. Now to add a few controls for easy selection and to finish it off. Create a NURBS circle, name it hip_ctrl. Duplicate it and name it shoulder_ctrl. Snap the shoulder_ctrl to the top of the spine. Select hip_ctrl and hip_joint and parent constraint it. Select the shoulder_ctrl and shoulder_joint and parent constraint it. Figure 9 shows the controls and the spine twisted and manipulated.
  20. I really hope this tutorial is helpful. If you have questions, comments, or critiques feel free to state
    figure9

    figure9

    them. Let me know if there are errors and i’ll fix them as soon as i can. If enough people are interested I can show how to make the spine squash and stretchy. Its not that hard just takes a bit more work. Let me know and I’ll add an addendum to this post.

Side 90 and twist 180

Side 90 and twist 180

Here is a link to the file, change the .doc extension to .ma. It is a 2008 file, but you can change the header to work for your version of maya. awesomespine1

~ by animatix on October 8, 2008.

31 Responses to “Awesome Spine Setup”

  1. interesting. how does this compare to the ribbon spine?

  2. I’ve setup a ribbon spine before, and they work well. I think its just more a personal preference to work with this setup, plus it lets me setup an FK system if needed, Squash and Stretch, and independent twist. I’m not saying the ribbon spine can’t do all these things, just that I haven’t tried.

    Also, the ribbon spine I’ve used, had a lot of aim constraints and I find ikRPSolvers easier work with. Plus, I can still get at the rotations when I use an IK solver.

  3. stretch and squash rig tutorial please

  4. I like the simple technique it helped solve a dilemma of mine which I had a convoluted work around for. Have you ever tried using a motionpath node or pointOnCurve node? I personally prefer either one over ikSpline due to a some of the limitations the ikSpline has. Plus you get automatic stretch as well as individual curve position for each joint.

  5. How do you add in the FK controls?

  6. te: I haven’t tried the motionpath or pointOnCurve node yet, but its definitely on my list of things try for Awesome Spine version2.0 🙂

    stupidVampire: The fk is just a few joints along the spine that has the shoulder_anim parent constraint to it. So if you want a fk like system its there, but still has the benefits of the ik system.

  7. hey berglund,
    I was poking through this setup again, and I noticed that if you try to group the controls under an ‘all’ control of sorts…I believe it is your ‘root_anim’ control, the spine doesn’t react to the Y rotation of the control. It always faces the same direction. I’m going to start poking around with it a bit, but didn’t know if you’d solved this issue yet?

  8. Yeah, that happened to me once, I am trying to recall how i solved it. I think it was a hierarchy issue, making sure every was parented correctly. I’ll see if i can replicate it, or send me a file with that problem and I’ll fix it then post the solution.

  9. Well, I saw it in a file I made, but then downloaded yours from here, and checked it out and it had the same problem. I’ll keep looking around. That was the only real issue I saw with it.

    Have you had any luck experimenting with motion paths or anything else you mentioned you may try in a past post on CGTalk?

  10. Ok here is the fix, i will update and upload the file soon. Parent the spine_grp to the root_anim. The select the spine_1_bind_geo, open attribute editor (ctrl-a) and UNCHECK Inherits Transforms. it should be good to go then. Thanks for pointing that out molemansd7!

  11. Hey berglund..that did seem to work. I’m going through now to implement the FK controls. One thing you may want to mention in your tutorial also, is to make sure and set the rotation orders of the controls, so that the twist is evaluated last. Otherwise, the functionality could be setup correctly, but the behavior be out of whack. I ran into that last time I tried to set this up from scratch. It could be frustrating to people trying to learn who don’t have a lot of experience with rigging. Keep it up, though. I’m excited to see what’s coming next.

  12. what about FK Spine .can u make a new tutorial with both Blendable FK IK spine

  13. Great setup, really liked it. Just one question though… is their anyway to scale it?

  14. Actually, yes. The Rockwell rig has this, if you change the GlobalScale value the entire character will scale.

    I’ll try to add that to the tutorial. Thanks for mentioning it.

  15. Please expand this tutorial to include features like stretching. Thanks.

  16. hello. thanks for this very excellent tutorial! I only have a couple questions about it tho…hoping you might be able to clarify …because aside from the basics, I’m not much of a rigger (i’m an animator) but I’m trying to learn it.
    – On step 7, do you mean parent constrain or parent hierchy (ie group beneath / ‘P’ hotkey)?
    – I get to the end, and I am able to rotate the hip and shoulder joints endlessly without flipping, but when I parent them to nurbs controls, the chain flips after around 130 plus/minus in ry. I’ve made doubly sure that the controller was snapped to the joint and my transforms were frozen, but still no avail.

    I’m having a tough one trying to figure this one out. Any ideas?

    -Thanks again for a great tut!

  17. Charles: on step 7 I mean parent not parent_constraint.

    I’m not sure why its flipping for you, and its hard to tell from your description, if you want to send me a file i can try to take a look at it.

  18. thanks for the quick response!
    I wasn’t sure where to send it to so I’ve uploaded it on my website for direct download.
    Link is this:
    http://www.animationspot.net/videos/WIP/LegoMan_rig_005_CL.zip

    thanks again.

  19. Ok, i see whats going on. When you parent constraint the hip_joint to the CTRL_hip it gets weird values for rX because the CTRL_hip local rotation axis doesn’t line up with the hip_joint. What i did to fix this was:
    parent (no parent constraint, these are two different things) the CTRL_hip to the hip_joint, freeze transform on the CTRL.
    Unparent the CTRL, create an emptry group, parent that to the CRTL. go to the channel box and zero out the empty control.
    Then unparent the group, and parent the CTRL to the group. In the channelBox the CTRL should have all zeros.
    Now parentConstraint the hip_joint to the CTRL_hip.
    This should fix any flipping. Let me know.

  20. Thank you thank you thank you so much man! You are genius. It worked. Look forward to part 2 of the tutorial when it’s ready =)
    Thanks again man.

  21. thank u dear………….it wazzz awesome…..cant wait 4 the next….

  22. plzzz update ur tutorial…..we all waiting 4 that….

  23. Woow.. ! cool setup nice, you blend both ikSpline and ribbon as well, really great technique. Really helpfull. I am gona share this article on my blog, for others from you, hope you won’t mind.

    Thanks once again.

  24. Hey there, great tutorial! I’ve got it working and am attempting to add the FK and stretchy stuff. Can you quickly run over the steps? I’m assuming after looking at your file that i want to make a series of joints and then have their scales linked inversely (?) But then how does it connect to the shoulder and hip joints? is it parent constrained to the shoulder and then has a sum of the rotations from the FK joints? I’m almost there i think…Thanks in advance for any help

  25. […] Awsome Spine Rig Hey, As we all know there are couple of techniques for building advance twisting torso . One is by Jason Schleifer which became a very standard and well known technique in the industry and second is Arron Holly’s Ribbon Spline. As we know there is always an issue when we rotates spine about 180 degree, which can be avoided by using, yes you are right  thats “Ribbon”. Very handy and great technique.   Recently I saw a tutorial written by Mat Berglund about creating no flip spine with the help of ik handles, pretty straight forward and time saving. It is a blend of quite a bit of ribbon and number of IK handles. Very useful technique. Rad the tutorial. […]

  26. Hi, your awesome spine is truly awesome! I tried your tutorial and it worked well. After awhile, I was trying to implement this into my rig. I wanted to have the orientation of the joints as: +Y as aim and -z as up Vector. This is to have the orientation to match with the world space orientation. However, I couldn’t get this to work correctly when create IK Handles. As soon as I make the PV constraints, the joints would be rotated by themselves. How can this problem to be solved? Thanks!

  27. Hi, I would like to say this is an awesome tutorial aswell =]

    I did a version of your ‘awesome spine’ using some AFR´s SS techniques (volume and profile) and it works like a charm.

    By the way,
    I did another one in 3dsmax and It did work as I expected.
    Let me know if you want t take a look into one of those files.

    see ya,

  28. nice tutorial thanks keep it up

  29. This Setup is good but seems complicated. Instead there is a better and easy setup to achieve the same.
    Just use the Twist and the Roll Attributes present in the Spline IK

    Twist Attribute gives you the Downward Twist in simple words and to get the Upward Twist working just connect the Twist and Roll in a manner that the Roll is always the Negative the Value of Twist by making an Expression.
    I can also provide the Maya File if anyone wants…:)

  30. this is really cool! I like it! one question tho, i noticed how the fk controls don’t really “stick” to the spine, which i suppose is what i was expecting, but, i was wondering if you know of anyway to correct that, or would doing so cause some sort of a cycle?

    Good stuff though! Ric

  31. […] Awesome Spine Setup by Mat Berglund https://faithofthefallen.wordpress.com/2008/10/08/awesome-spine-setup/​ […]

Leave a reply to Gabe Sventek Cancel reply