Tag Archives: FK

With the spine, arms and legs complete I needed to get the head and tail done to have the majority of the rigging finished so that I could start skinning. Creating the head controls was pretty quick and easy.

Head Neck

However, I wanted to give the animator the ability to control whether the head follows the orientation of the neck, or whether it always stays facing the same direction despite the neck rotating (as though it is constrained to the world orientation). To do this I created another switch controller and set up an attribute that would control the orientation. I then created two locators, both of which I placed on the pivot point for the head. I parent constrained one of the locators to the neck joint below it (this would be the local orientation locator). The other locator I point constrained to the local locator. This means it moves with the locator, but doesnt rotate. I then orient constrained the head controller to both locators and wired up the switch so that it would change the weighting of the constraint and therefore which locator the head follows.

When I went to start rigging the tail, I realised I had never actually built a deform skeleton for it. As such I quickly built the joints and used the comet tools to tidy up the orientations.

Tail01 Tail02

I decided to build the FK control system first, as it would be easier and faster. I created a small circle control for each individual joint and parent constrained the joints to their respective controllers. As always, all my controllers were parented to an _SDK group which was then parented to an _0 group. I wanted to make it easier for the animator to be able to animate large sections of the tail without having to select each controller individually. As such I created four extra controllers which I spaced evenly along the length of the tail. I coloured these yellow and the individual circles brown. This makes the controllers for controlling a larger part of the tail stand out more for the animator. Colour coding the controllers is important so that an animator can see at a glance how a rig works without the rigger needing to explain everything they have done.

Tail03

I then wired the rotation of each of the four main tail controllers to the _SDK groups of the individual tail controllers I wanted to control. This means that as the main control rotates, all of the joints in it’s section will rotate and therefore it will bend all of that length of tail.

Tail04a Tail04b

I also parent constrained each of the main tail controllers to the individual tail joint controller immediately preceding its section. This means that it should always move with the tail as it is animated.

I then set to work on the IK tail. As a monkeys tail is extremely flexible, I decided to create an IK chain with four spans. This means that there is a control point at either end, and three control points spaced evenly in the middle. I created clusters for each of the points so that I could parent constrain them to controllers. Unfortunately, as the monkeys tail was modelled in quite a curved position, I discovered that whenever I created the IK, the bones moved from their original positions. Despite playing with settings, I eventually accepted that I wasnt going to manage to get the bones to perfectly match up.

I point constrained the three middle controllers to the base and tip controllers, meaning that whenever one end moves, the controllers in the middle move as well. I changed the weightings so that the end closest to them had more effect.

I also tweaked the 0 positions of the controllers so that the IK joints lined up slightly better with the FK joints to try and minimise the movement of the deform skeleton when switching between FK and IK.

I set up a switch to allow the tail to swap between FK and IK, but I decided to add a couple of other attributes too. I set up an orientation switch for the tail that worked just as the head does, meaning the tail can either follow the position and rotation of the hips, or just the position.

Tail05

I also decided that animating an IK chain with no stretch can be very difficult, as if the curve is made longer than the length of the joint chain, the joints only shape themselves to the part of the curve they can reach. However, I didnt want to force the animator to have a stretchy IK tail, so I decided to add an attribute that would turn the ability to stretch the tail on and off. To do this, I simply used the same arclength node for the curve and a multiply/divide node as I have done in every stretch, but I added a condition node that would be affected by the switch.

Tail06

So at last, the majority of the rig building is complete. I can set up a deform test and start skinning the rig!

BodyComplete02

Having finally created working strethcy IK legs, I could get to work on making a set of FK legs. Like the IK, I duplicated the deform skeleton, but replaced the _jnt with FK_jnt. Unlike creating the IK leg, I didn’t need to create anything except controllers. I used the curve tool with snap to vertex turned on and drew the shapes around the mesh of the monkey. I used the MEL script “parent -r -s” to attach all the curve shapes to a single curve node so that the animator can click on any of the curves to select the entire controller.

The thigh and ankle controllers I drew with curves, but I just used circles (which I editted slightly) for the knee and tibia joints. To try and keep the rig clear to use I colour coded my controllers. The most important controllers I changed to a brighter colour and the less important ones (like the tibia joints) were darker.

Foot05 Foot06

Like before, I nested all of these controllers in a double set of groups (_SDK and _0). I then parent constrained each FK joint to its relative controller.

As the toe controls were parented directly to the deform skeleton (there was no seperate FK and IK version) I needed to get the main toe controller to follow both the IK and the FK skeletons. I created an FK/IK switch control for the leg and then proceeded to parent constrain the main toe controller to both the end of the IK and FK controller heirarchies. At the same time, I also parent constrained the deform joints to both the IK and FK joint chains.

I then had to wire up the switch to control the parent constraints between FK and IK. I used the hypershade to do this. I brought the switch and the parent constraints in and also created a reverse node.

Foot07

I then also wired up the visibility of the IK and FK controllers so that the animator can only see FK controls when the switch is at FK, and IK controls when it is at IK.

I decided to colour code the IK and FK so that it is clear at a glance whether the leg is set to FK or IK. For the IK I chose red (left) and blue (right), and for FK I chose pink (left) and green (right). However, since the toes are the same controllers whether the leg is in IK or FK, the controllers were just a single colour. I spent a bit of time trying to work out how to use the switch to drive the colour override for the control shapes. Eventually I found that I could use a condition node that was true when the switch was above 0.5 and false when below 0.5. Then I wired the condition node to the drawing override of the controller. As the drawing override is not in the short list of things in the hypershade I had to open the connection editor and wire them up in there.

Foot08 Foot09

Finally, I had to work out what number represented each colour. With some trial and error I eventually found the values and wired up all of the toe controllers so that they change colour. Success!

Foot10

March 14, 2013

So yesterday, I finally got the elephant rig to a point where it could be referenced into the animator’s files. One of the major things I worked on was updating all of the controllers so that they are clearer and fit the model nicely. I foolishly assumed this would be easy, but I hadn’t reckoned on the awkwardness of the curve creation tools in Maya. It took me quite a while of just repeatedly trying to create shapes and deleting them as they failed to work. I think my determination to create things that were perfectly symmetrical possibly did not help the situation, but an assymetrical controller just doesn’t look as neat and clean in my opinion. Eventually I hit upon the idea of using the snap to vertex tool and using the edges and vertices of the elephant to help me create controllers that fit nicely to the contours of the elephants body. Having drawn a selection of curves I needed to then join all the individual curves together into a single item. This involved reparenting the individual curve shapes a single curve node and then deleting the rest of the empty nodes. Frustratingly I could find no way to tell Maya to actually combine all the shapes nodes on each curve into one single curve, but each controller selects the entire item wherever you click it, so it still works, its just not as clean as I would like it to be. I then scaled the controllers out from the body slightly and coloured them. I had hoped I could then parent these new shapes to the controllers already in existence (as I had with each individual curve to make the new controller), but every time I tried, the new controllers were rotated strangely and moved away from the body. This was due to the difference in positions of the pivots of the old and new controllers. Hoping I could avoid having to reposition each new controller I decided to instead break all the constraints and set everything back up on the new controllers. It turns out I still had to reposition the pivots, and so rearrange the shapes, but at least I knew I didnt have to spend time trying to delete the shapes of the old controllers, I could just remove the entire item.

I did, however, forget to redirect the spine rotation to the new controllers, so I had a bit of a scare later in the evening when I created a global control and tried to check that everything moved as I wanted it to. When the elephant rotated 90 degrees, the spine flipped, presenting a problem I had first encountered in my 2nd year when rigging a quadroped in 3ds Max. I panicked for a while that my IK spline spine was in fact broken and I would have to come up with a completely new set up. However after I checked the IK I realised that in creating the new controllers, I had not told it to use them to decide the rotation of the spine. Thankfully, this fixed the problem.

IKspine03a

I also needed to update the rig with the new low poly model that my artist had altered for me. I brought the mesh in and whilst trying to work out how to load the skinning from the old mesh to the new mesh, I found an option that instead replaced an old mesh with a new mesh. I tried it out and it worked brilliantly. The old mesh changed to the new mesh. However, I now had two versions of the new mesh, one that was skinned, and one that was not. Assuming that the unskinned mesh was no longer needed I promptly deleted it. A couple of hours later, when testing some other part of the rig, I discovered my mesh no longer seemed to be moving with the bones. Confused I saved the file under a new name, closed it and reopened it. To my horror, the mesh was now invisible. The outliner still showed all the various parts of the mesh, but I couldn’t get them to appear.

MissingMesha

I hastily opened my previous iteration only to discover that that file suddenly had exactly the same problem. Desperately hoping I hadn’t somehow broken every single version (and so lost all my skinning) I tried the next step back. To my relief the old mesh was there and skinned and working absolutely fine. I had simply lost my day’s rigging work, but nothing else. Deciding that replacing the mesh clearly wasn’t the best method to update my rig, I started working on saving off the skinning so that I could load it onto the new mesh. Frustratingly it seemed Maya was only giving me the option to load each bones skinning one at a time. It was doable, but a bit pointlessly time consuming. Fortunately, I knew one of my classmates, had successfully, and easily, loaded skinning onto new meshes during his project. I asked him about it and he showed me a quick and easy method. It involved skinning the new mesh to the bones (but not editing it at all) and then telling the new mesh to look at the old mesh for the skinning values. Maya can load the skinning in a variety of ways, by volume, by UV map etc. It was brilliant and loaded the skinning onto the new mesh perfectly. I didn’t even need to tweak it, though Joe had warned me I might need to. This is great to know as I now know I can quickly skin the high poly elephant to the rig (and tidy it up afterwards) as soon as it is ready. I will not have to go through the time consuming process of skinning from scratch again.

The last thing I needed to build was dynamic tail. Having already gone through the long process of working out how to do the trunk, it was simple a case of repeating the method on a much simpler chain. The dynamic output curve became a blendshape for the spline whilst the controls affected the dynamic input curve. Again, unfortunately, the rig doesn’t update its position until the animation is played, but, to my current understanding of dynamics, there is no way around this.

I also created a control for the tail that will rotate all three FK controllers at the same time. I actually created three of these for the trunk as well, so that an animator can control the entire tail (or a section of trunk) without having to select a whole bunch of controllers. Every controller I create is parented to a group (with the suffix _SDK) and that group is then parented to another group (with the suffix _0). The _0 group becomes the null group, which provides a 0 point for position and rotation. The _SDK group allows me to create batch controllers whilst still making the individual controllers able to tweak the bones position. I simply wired the rotation of the batch controller to the _SDK groups of the relevant individual controllers. When the batch controller is rotated, each _SDK group wired to it also rotates. The individual controllers parented to the _SDK groups also rotate (due to the parenting) and so rotate the relevant bones. However, because the controls are not wired to anything, the animator is still able to tweak the position of the bones individually at any time.

 Tail01a

I then set up a switch for the tail to allow the animator to blend between dynamic and FK. Like the trunk I also set up some attributes to allow the animator to change the stiffness and flexibility of the curve dynamics if they wish.

Tail02a

Finally, I added some empty attributes to various controllers ready to be wired up to blendshapes when I have the highpoly mesh. I created them in advance so that it is less likely there will be any problems with the referencing when I update the rig later on. I wanted to make sure that everything that might be animated was already in place, and so it is only skinning and wiring and not controllers that will change in future files.

March 12, 2013

The elephant’s trunk was one of the most challenging parts of the rigging. I knew I wanted a simple FK trunk, and I knew I wanted a trunk with dynamics. However one of my animators had also informed me they wanted an IK spline trunk to animate with as well. As such, I needed a trunk that could switch between any of these, and more importantly, blend between any of them to any of the others. My desire to allow the trunks to blend meant I couldn’t simply use an “enum” attribute to change the parent constraints as this is an “all or nothing” attribute. Theres no way to have half of one and half of another. I also decided I couldn’t use a single “float” attribute with one of each of the control types at -1, 0 and 1. There would be no way for me to blend between the two trunk control types at either end (-1 and 1). They would only be able to each blend with the control type that was at 0.

Eventually I decided to use two different sliders, one that would blend between FK and “other” and a second that would blend between IK and Dynamic. This second slider controlled what the “other” was. In order to do this I had to create four duplicates of the trunk bone set up. I had an FK duplicate, an IK duplicate, a Dynamic duplicate and the “other” duplicate. The deform trunk was parent constrained to both the FK and the “other”. I then wired up the FK/other attribute to control which parent constraint was in use. The “other” trunk was then parent constrained to both the IK and the Dynamic and these parent constrains were wired to the second IK/Dynamic attribute.

It meant spending a huge amount of time in the Hypershade, wiring up various items. It was extremely time consuming as I had to organise items in the hypershade so I could see what was parented to what and where the wires actually needed to go. Its definitely the largest wiring system I’ve created when rigging so far.

Trunk01a

Trunk02a

Trunk03a

Having achieved the ability to blend between any of the different control systems, I needed to actually work out how to create a dynamic trunk. I watched a variety of tutorials and read a load of sites before deciding what I felt would be the cleanest, and simplest, way of rigging it. I applied another IK spline to the trunk and then duplicated the spline curve. This duplicate would be the input for my dynamics. So this was the curve that I had to create controls for. I made them in the same way as I did for the trunk, by creating clusters for the various points along the curve and parent constraining the clusters to controllers. I then applied dynamics to this duplicate curve which created another two curves in the process. One was the dynamic curve, and one was the output of the dynamics. The final step was to make this output curve control the original IK spline. I simply applied a blendshape to the spline, turned it up to 1 and locked the attribute so it couldn’t be changed or broken.

Working with dynamics is slightly strange though, as the dynamics only update when Maya plays the animation. This means you can tweak the starting position of the trunk, but it doesnt actually move the mesh (or the bones) until you press play. I think it unlikely the animators will want to ever just have a dynamic trunk, but I feel it may be nice to blend with some FK animation to add some extra secondary motion to the trunk.

Finally, I created some extra attributes so that the animators can edit the flexibility and stiffness of the dynamics and so affect the way Maya calculates the shape of the output curve.