Hey again, so last we left off we were about to start on Control Curves. To start, we need to make another rig, something called a Reverse Foot Rig. To make it, we'll need to do what we just learned two more times on our existing joints, first from the ankle to the ball joint (no in-betweens for these) and then from the ball to the toe. Because we're making several new handles, make sure to name them appropriately, the first (ankle to ball) will be LF/RT_ball_IK_handle and the second will be LF/RT_toe_IK_handle.

Here's all our six IK handles highlighted now. That's fine, but not quite enough to make the Reverse Foot Rig. Now, we'll need reverse joints. These joints will be snapped to the forward skeleton joints, and there will be four in total: reverse_heel, reverse_toe, reverse_ball and reverse_ball, each snapped to the corresponding forward joint by holding the 'v' key while readjusting them after placement. Because the heel joint does not have a forward equivalent, we'll place it just beneath the ankle joint, where we want the heel to rotate

So once we're done, we'll have a reverse foot skeleton that mostly overlaps the forward skeleton. One last step to help orient that loose heel joint better is to select it and under the skeleton tab click, "Orient Joint" I've done some reading and supposedly joint orientation is a bit of a sore point that can break rigs, though it sounds like using the Orient Joint tool isn't in itself a solution to this. We'll keep it in mind for the future and move on for now.
The last step for the reverse foot rig is simply, to take the IK handles we made, and make them children of their respective joints. That is, move each handle under each joint like so:
Understandably, this whole process is a bit obtuse, the connection line as I understand it is that we have our base skeleton, we created IK handle objects to move pieces of that skeleton together, and then made the handles children to our reverse foot rig to provide an extra degree of control and association with the forward rig itself. It's a little difficult to fully understood even to me and I made the dang thing, but the bottom line is that we're keeping everything simultaneously connected, organized, and influential over one another so that once we get to the animation step, these relationships will automatically take effect, and we can spend more time on the overall motion rather than needing to animate each joint independently.
While for the most part we've implemented all the functionality we need, there is one more step to help communicate the purpose of all these new handles and joints we've made by visually indicating their purpose and locking off certain transformation options depending on each joint. As ever we'll take it a step at a time. Maybe I should've split this into two parts eh?
So now, we're going to make Control Curves. When you look at professional rigs you usually see these red (right) and blue (left) outlines, rings, directionals, etc. around the important control points of a model. they basically provide easy to select, external controllers for the model without needing to select any joints or handles, since those aspects of the model are delicately connected. Controllers keep everything concise, organized and can be more safely manipulated by the animator.
To start, go to the Create tab, go to NURBS Primitives, and select Circle from the menu, this will make a plain circle at the base of the workspace:
This is fine, but we can shape it to resemble the foot itself. To help with this, we can select the control vertexes and shape the circle more like a foot.
We'll want to freeze the control curve's transformations, so that the animator can understand this as the default position for the foot at 0, 0, 0, so that they can reset their position easily when needed. Then, we can duplicate the object and inverse it by scaling -1 on the X-axis (and freezing that transformation as well once it's snapped over the other leg). I noticed the pivot of these curves were slightly offset as well, so when needed you can go to the Modify tab and select "Center Pivot" to keep your object centers... Centered. There's our first controls, RT_foot_CTL and LF_foot_CTL, now let's create ones for toe_pivot, toe_wiggle and ball_CTL. Again, we can use 'v' to snap these controls to the general location of what joint they'll be affecting.

Here's the full set, for now they're just curves, but shortly we'll tie them to our actual rig. First though, let's distinguish them from one another. For each object, move into the Attribute Editor, under the Shape tab, go to the Object Display dropdown, then the Drawing Overrides dropdown that expands from there. Click the Enable Overrides option, and select from the Index Colors for your curves. Standard practice is to use bright red for right, true blue for left.
Now that everything is in place, we move to our final step, utilizing constraints to tie our control curves to the rig. There are different types of constraints and we'll be using a few of them for our curves. The ball and toe pivot require orient constraints as they'll be rotation-only controls, the toe wiggle control will be translate only, as will the foot.
When creating constraints, we want to select the control first, followed by the joint it is affecting. In every case, the controls will be constraining the reverse joints we made. Let's start with the toe pivot, which is the small, diamond-shaped control. Select it, followed by the reverse_toe_JT
Click the box next to Orient and check the properties of this action, we'll want to check the Maintain Offset box, as it will allow our joint and curve to maintain their relative positions. This will prevent the control from snapping to the joint and causing any unexpected issues.
Now, when we rotate the toe pivot control, the foot will rotate along with it, and we can see the connection by the red chain orientConstraint in the hierarchy. As one last consideration, because we only want to use this constraint to rotate by the Z-axis, we can lock the other transform attributes in the channel box to prevent using the constraint for anything but its intended purpose.
We can do this for each constraint, simply considering the type of movement the control will be doing, and locking off the transformations that don't apply. Try doing the same for the ball control curve, figuring we will only need the X-axis rotation for its function. Select LF_ball_CTL > LF_reverse_ball_JT, go to the Constrain tab, and select orient once again.
Next, we're going to use a Point Constraint on the forward skeleton's toe joint. This one uses Translation on the X-axis. Again, make sure to check Maintain Offset when you create the constraint!
To make things more simplistic we can also use the Channels tab in the Channel Box to hide our locked transform fields after we've locked them. It's not required but it does clean up the interface.
Finally, we'll use a Parent Constraint for the Foot Control. The Parent Constraint provides control over both the translation and rotation of its affected joint. We'll be constraining this one to the reverse_heel_JT. We won't need to lock or hide any of the translations or rotations, but if we want we can hide the scale tool. In my case I'm going to leave them alone however, as some fighting games will actually scale appendages during attacks to emphasize a punch or kick by enlarging the related limb.
So two corrections, I realized that I've been calling both the reverse joints and curve controls we've been working with LF when actually they should be the RT joints, we even colored them red and I still didn't notice! Honest slip-up on my part, thankfully we can just rename everything properly. Sorry about that!
The other slip-up is that when we created the reverse joints, I created them in the wrong order. The hierarchy from parent to child should go:
reverse_heel_JT >> reverse_toe_JT >> reverse_ball_JT >> reverse_ankle_JT
Anyways, the foot_CTL will be set up to the heel, but we also want it to affect every other curve (thus why it's important that the heel is the parent of the reverse joints). In fact, we've got a few relationships to set up here. Let's parent our controls in this order:
foot_CTL >> toe_pivot
toe_pivot >> ball_CTL
toe_pivot >> toe_wiggle (both ball_CTL and toe_wiggle are childed under toe_pivot)
Changing these with everything we've done up to this point is causing the foot mesh to distort strangely and permanently unless I back up several steps. I don't know why this is happening but seemingly as soon as I move these control curves the primary skeleton actually breaks, as in the joints are literally removing themselves from the skin they're bound to. Very weird. I'm going to go back and redo a lot of this to try and correct the issue. In fact I may go back to the initial rigging and try to make a more optimized skeleton, just because I've been running into so many little issues along the way here.
UPDATE: After redoing the entire rig with some improvements, (I added a few extra facial joints to attempt mouth movement) I'm still having model instability issues when trying to create the control curves. Maybe I followed the tutorials wrong? I can't say for sure, but for now I'll leave it out with what I have left in place so far. I hoped by documenting everything it would be easier to troubleshoot, but Maya can be very fickle and there's probably something I'm missing here. I think this is an okay point to stop off for the midterm presentation, and once we figure things out we'll move forward to spend the remainder of the semester animating. I've created everything we made over the course of the post, but I'm going to postpone connecting anything or creating constraints until we know what's causing these issues.