Tag Archives: rigging

Posted in: Other

So, I was lucky enough to be one of the successful applicants to Double Negative’s first ever graduate open day. I’ve been interested in the work Double Negative does for a long time now, especially after a great talk we had during my second year about their work on John Carter. It was a fantastic opportunity to get a closer look at the company and how they operate. The afternoon consisted of a short tour (avoiding showing us anything that needed to stay out of the public eye of course) followed by a really interesting talk about some of their work on Fast and Furious 6. Next there was a Q&A session followed by a chance to network with a variety of the staff.

I had some really interesting conversations about possible career paths and I now know that getting into the rigging team at DNeg is possibly one of the hardest goals I could set myself. Of course, that hasn’t put me off, its merely made me all the more determined to prove what I am capable of.

The final set of controls left for me to build were the face controllers. Unlike the rest of the controllers these needed to be placed very close to the mesh. I felt that the thin lines of the curves I had used for everything else would not be very obvious or easy to select for the animator. Instead, I used the top of a NURBS cylinder as this provided a small filled in circle which was much easier to select.

I wanted the mouth shape to be really flexible for the animator, so I placed a controller for each corner of the mouth as well as three along the top lip and three along the bottom lip.

Face01

I also wanted the animator to be able to easily move the position of the entire mouth, so I created a simple curve shape that I placed a small distance away from the mesh.

Face02

The nose was slightly simpler. I created two controllers that would allow the animator to flare the nostrils. I then created another simple curve that would allow the animator to move the nose about the face.

Face03

Finally I created three controllers for each eyebrow and a simple position controller for each eyebrow. I also decided to change the circles from the yellow as I felt it was too bright and distracting when looking at the face. I changed them to a dark blue instead.

Face04 Face05

Once I had built all the controllers I needed to start parenting them to the correct things. The nose and eyebrows were extremely simple, as the heirarchy was fairly obvious. However I had a lot of trouble finding something that would work for the mouth. I obviously wanted the controls on the bottom lip to move when the jaw was rotated. However I also wanted them to move dependent on where the mouth position controller was. Eventually I came up with the idea of creating two locators that were aligned with the jaw bone pivot point. I parent constrained one to the head and one to the jaw. I then point constrained the locators to the mouth controller. I could then parent constrain my individual mouth controllers to the relevant locators.

Face06

Unfortunately, the parent constraint on the locators clashed with the point constraint, so that when the jaw rotated the locators moved slightly and the mouth controllers disappeared into the mesh. It took me a little while to track down the problem, but once I had found it I decided to just replace the parent constraint to the jaw with an orient constraint and this fixed it.

Face08

Now that the first hand in has been and gone, I’ve been finishing off the rigging of the monkey. There were a few bones in the face that I had animated for the deform test that weren’t actually rigged. Firstly, I created some curves to control the ears and the two tufts of hair on the monkey’s head.

One of the most important things I still needed to create was some eye controllers. I wanted each eye to be controllable individually, but I also wanted the animator to be able to easily control them together. As such I decided to create two text curves (R and L) and aligned them with the eyes. I then used an aim constraint so that the eyes point at the controllers at all times. I created a third controller that would move both R and L together.

Eyes01

I also wanted the animator to be able to control the size of the pupil, as I have always found this to be a particularly effective tool to portray emotion when animating a “toony” character. Unsure of whether the animator would want to be able to control the pupil size from the individual eye controllers or from the dual controller. I decided to give them the ability to do it from either. I added an attribute to R and L for pupil size, and two attributes to the dual controller. I then wired these attributes to two plus/minus nodes. I have set the nodes to addition and as soon as I have the eye textures, I will wire the nodes to the scale of the texture.

Eyes02

Rigging the tongue was slightly frustrating as I really struggled to create controllers that could be selected whatever position the tongue was in. Initially I created simple curves that sat above the tongue. However, when the tongue was rotated upwards, the top curve disappeared into the back of the mouth.

tongue01 tongue02

As such, I decided to create some loops that went around the tongue and combine these with the curves above the tongue.

tongue03

April 25, 2013

Yesterday was the deadline for our first hand in. Its a chance to collate everything we have done so far and hand it in to the tutors to get some feedback before the actual deadline. Obviously nothing is finished, because we still have three weeks of work left to do, but its nice to be able to show the progress so far.

When I hand in the final versions of these I will be adding text to explain the rig demos and make them a bit clearer.

YouTube Preview Image YouTube Preview Image YouTube Preview Image

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

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.

February 19, 2013
Posted in: Glamorgan

The basic rig is now complete, which means I can now create the deform test and actually skin the low poly mesh to check how everything deforms.

Deform Skeleton

It was such a relief to finally be doing something that felt constructive. My first step was to build the deform skeleton. This is the set of bones that the mesh will be skinned to. It is important to get the bones placed correctly so that joints bend in the right place and the deformations of the mesh are as natural as possible. With the skeleton built, I used comet tools to help get all the bones aligned correctly. This ensures that the axes of rotation are where I want them to be, and therefore the rig will be easier/neater to use.

At this point I also made sure all my bones were named correctly. Every joint name starts with either C_, L_ or R_. This denotes whether the bone is down the centre of the body (C_), on the left hand side (L_) or on the right hand side (R_). This is then followed by the name of the bone, and possibly a number (ie spine01 or trunk03). Finally, every joint ends with _jnt. A good naming convention is essential when rigging as it makes things much easier to find with a search tool etc.

IK Spline Spine

Once everything was named correctly I set to work creating a control system for the spine. I used an IK spline set up. To avoid causing problems and having to rebuild the deform skeleton, I duplicated the spine and placed the IK on the duplicate. I could then parent constrain each individual IK bone to its equivalent on the deform skeleton. This causes the deform skeleton spine to do whatever my IK spine does. I chose to create an IK spline with just two spans. This means the spline has three control points: one at either end and one in the centre. I turned these into three clusters which I could then parent to various controls.

IKspine01a

I created a simple cube control for the hips and shoulders of the elephant which I deformed slightly so that they fit the contours of the elephant slightly better. I then parent constrained the corresponding clusters to these controls. I used a simple circle for the middle of the spine and again parent constrained the centre cluster to this control. This provided a way to control the spline curve and so control the bones. However, if a control was moved too far away and the spline curve became too long, the bones did not stretch and so only covered part of the curve.

This was an undesirable result, so I set up a fairly simple wiring system in the hypershade. I created a node for the spline curve with a single attribute: the arclength of the curve. This value changed whenever the curve changed, meaning I could always know how long the curve was. Using this changing value, and the curve’s original length, I set up a divide node that would calculate the current length divided by the original length. Then I used a condition node that was connected to the x-scale (length) of all the bones in the spine. If the curve was the same length or shorter then the scale of the bones remained at 1. However if the length of the curve was ever longer than its original length, the scale (length) of the bones was changed from 1 to whatever the divide node calculated. This meant if the controls were ever moved too far apart, the bones would scale and still fill the entire curve.

IKspine02a

However, I discovered that while this worked really well when the curve was long, it didn’t work very well if the curve got too short. Some of the bones started flipping to try and remain within the length of the curve. As such I decided to completely remove the condition node and simply wired the divide node straight into the x-scale of the bones. The spine now stretches and contracts brilliantly.

IK leg

The next step was to create an IK leg set up so that the legs could be easily animated. I debated for a while which two bones to put the IK on before deciding it definitely needed to be shoulder->wrist/hip->ankle. Like the spine, I duplicated the deform bones and applied the IK to the duplicates. I created a foot controller which was, again, a slightly deformed cube. I parented the IK target to this controller and orient constrained the ankle joint. This meant that I could move the controller and the leg would bend, but the foot would remain in whatever orientation the controller was in. Finally I added a controller to move the top of the leg around. I then repeated this for all four legs.

BacklegIK01a

The rest of the body I decided to keep simple for this basic rig and I used simple FK set ups in the neck, head, trunk, ears and tail. With all the controls complete I decided to try and make the rig clearer to use. I started colour coding my controls; green for left, red for right, cyan for anything down the centre. I also made a centre of gravity controller which could move both the hips and shoulders at the same time, in case the animators wanted some FK control from the hips. This I coloured yellow to make it stand out.

BasicRiga

However I decided that the cyan was too close in colour to the “selected” colouring that Maya uses. As such I changed things again:

BasicRig02a

October 24, 2012
Posted in: Glamorgan

So, term started a few weeks back, and after a week of throwing around possible ideas for major project things actually got going. This project is all about learning new skills; specifically Maya skills. Gotta say, bit of a shock to the system. Whilst I can see the potential Maya clearly has, there is a part of me that loathes it every time I try to do something. Why must clicking on things be so difficult?! That, really, is my number one pet peeve. Trying to select items in Maya feels a bit like bashing your head against a brick wall. You click, Maya laughs to itself, knowing you were one tiny pixel from success and promptly does the exact opposite of what you wanted.

None the less, I do seem to slowly be getting to grips with all its little quirks and slowly but surely some progress is appearing in the project. That being said, Im still behind schedule, so its not perfect yet.

For the first week we spent some time doing some reasonably simple ball animations, just to truely get to grips with animating in Maya and how the program works. This second week is when things really got going. Rigging and animating. However, since I have very little interest in bipedal and character animating, my course leader has changed my brief up a bit allowing me to spend a larger period of time on rigging and then a short bit of animating. It took a lot of tutorials, and a huge amount of frustration as I hit brick walls where my knowledge of the program ran out, but I have finally managed to complete a nice little horse rig. Now I just have to animate a walk cycle with it! Before attempting the horse I did quickly complete the “ball with legs” rig that the rest of the animators are doing to ensure I had a reasonable understanding of the rigging basics in Maya.