I decided to make this post to demonstrate my work process when rigging a character, using a hybrid pipeline with techniques I’ve learnt form a lot of different people. This is just my approach to the entire thing but if there is anything you might find valuable here, feel free to try it out. My general approach is to finish the entire rig and all its features before I even attempt to start weight painting the mesh. I will follow up this post with another rigging session, hopefully in the next week if I got the time.
1. Placing joints, naming convention and creating control objects
One thing I started with recently was to throw in everything I needed into the main controller and start rigging inside it. It’s easy to forget a main controller to move the character with the rig attached and it can be troublesome to do it later.Without any joints, it’s hard to even start doing anything. I’ll create separate hierarchies for each major body part before connecting them together.
I use a simple naming convention with a capital letter in the beginning to identify the side of the character and underscores to separate terms such as “middle”, “lower” etc etc. One thing I started with recently was to throw in everything I needed into the main controller and start rigging inside it. It’s easy to forget a main controller to move the character with the rig attached and it can be troublesome to do it later.
2. Joint Orientation (and why it’s a no man’s land)
Joint orientation can be really confusing and I still have a hard time to fully grasp the concept, but as long as you’re consistent with your joint behavior throughout the rig, then it’s fine. The general idea is to have x as the primary axis, and then there are some different debates about whether z-axis or y-axis should be pointing forward. I decided to go against the stream and have the Y-axis point backwards, and thus it is so throughout the entire rig. Main thing here is that x is my primary axis.
Essentially we want to avoid negative values where we wouldn’t expect them, but I try not to get stuck for too long here. It’s the same rule for negative and positive values, as long you’re consistent, there is no worry. It’s a no man’s land as my graphic teachers used to say, due to the many different widespread ideas of the ideal orientation. I guess it’s different depending on what we are trying to create and I think I know what I’m doing. I hope I know what I’m doing is the correct term to use here.
This is pretty much the general expression I’m met by when asking about this topic:
3. Arm FK rigging
Here I start by creating transform groups by gathering the joint positions from a parent constraint that is immediately deleted after it’s used to place the group. Then I grab the corresponding control object and select the orient constraint. This process is repeated all the way down to the wrist.
4. Leg IK rigging
This step can be a little bit tricky, but I’ll try to be as clear as possible. Generally it’s not that hard, it’s just a matter of structure and hierarchy.
For each separate leg, I’m using a total of 3 IK handles. The first and major one, the IK.stretching from the thigh to the ankle, uses a rotate plane solver. Later I connect one IK handle between the ankle and the “ballfoot”, then from the “ballfoot” to the end of the foot. These are single-chained.
The two transform groups inside of the main foot control takes care of each separate part of the foot, upper area and lower area. By placing the rotate plane solver IK together with the single chain IK ankle to ballfoot, we recieve a good foot roll without having to use a reverse control, which has its own set of benefits. The single chain IK ballfoot to foot end is later place in its own group, ensuring full control of the rotation by the toes.
I also put in a pole vector for each leg, so I can twist and change direction of the knee
5. Back IK spline rigging
For the back I’m using a back spline IK handle with clusters controlled by their own control objects. In the advanced twist controls, we get to see one of the first instances where the names of our controllers truly matters since we need to specify a Start/End for our twist. These settings vary between different joint orientations and can easily break if you’re not careful.
I finish this process by creating another control object to include both my Start/End controllers, so I can seize full control of the upper body and keep the IK control for the legs a bit more separated. I still consider this part to be the hardest, but it’s worth the effort to get the spline IK to work properly.
If you were ever doubtful of my decision to have the Y-axis point backwards, I can assure you that the bend from the clusters is working.
6. Arm IK rigging with switch
Main problem with the switch, since it’s only the second time I’ve created such a system, is that we suddenly have three joint chains with separate control setups to connect together. While their setups aren’t that complicated, getting them to work together is a whole other thing.
The very first thing I’m starting to do is to copy the arm joint hierarchy and place them in the outliner in such a fashion that I name them by their system:
- R_Arm_Group <—– (Export skeleton)
After setting up both systems, I then create a locator which I’ll place at the same position at the shoulder joint using a transform group. We have to point constraint both the FK and IK joint chain to this locator, but also parent constraint the FK system to it. Otherwise, none of the joints would follow properly. The locator is simply used to keep everything in the right place.
Both systems goes into separate layers in which I can give them a color, making it easier to identify which one I’m currently working with. To switch between the systems, I need to create a driven key and it will be a single curve letter “S”. On this control object, I add a new attribute that I call “SwitchBetweenIkFk”. Next, we have to move into the outliner since we need to remember the order of how we execute the following connections.
Ctrl-select in the following order…
- Select the R_FK_Arm joint
- Select the R_IK_Arm joint
- Select the R_Arm joint (Export skeleton)
Go ahead and create an orient constraint with the “Maintain offset” box unchecked. Repeat the same process for all joints in the different hierarchies.
When all the constraints are in place, we start to set the driven key:
The switch controller is loaded as the driver, while the previously created constraints for the export skeleton is going to be driven. The FK system is set on the value of 0, while IK is activated upon setting the switch value to 1.
Note that I’m saving the hand group and its controls for later, since you want to work your way down into the arm when you’re rigging, not the opposite. We invert this approach when weight painting, when we want to make sure if any weights are removed, they are pushed into the center of the character.
I also set up so the inactive control is hidden by switching between on/off on the visibility attribute. Yet still, there is a slight problem about the transition between them. We need to make it smoother, so we jump into the graph editor and fix that right away:
X Wrong transition
✓ Correct transition
And here is the final result of the FK/IK switch:
7. Hand controls using driven keys
Same thinking with the fingers, I’m using the rotation of the Z-axis on the control object and rotate the joints to later set different intervals of keyframes.
Especially with this control, I want to make sure there is a limit so we can’t brake the fingers in opposite direction.
The transform group for the hand is now also following the different systems since I left and extra joint in the hand to act as the parent for the group. And there we go, that settles everything with the RIGHT arm. Same procedure remains for the left arm, which will be the entertainment for the rest of my evening.
In the next session, I’ll finish up the control rig and start weight painting. I’m already looking forward to start animating 🙂