While Daisy’s first model & rig were completed in 2010, the new & improved versions have been in the works since 2014. Why is it taking so long?

In my previous post, I focused mainly on modeling, and how every year I’d update Daisy’s model so that it stayed current with my drawing style. That’s only half the story, though. The other half is that at the same time, I had much to learn about rigging and scripting.

It Starts…

When I rigged Mary-Anne back in 2005, I barely knew anything about rigging. I’d only been in the game industry for a couple of years at that point, and the extent to which rigging in Maya was covered at the school I went to, basically amount to “this is how you add IK to a limb”. Rigging also wasn’t something I was interested in – animation was my thing. But if I was ever going to animate my own characters, learning to rig wasn’t something I could avoid forever. Freely downloadable scripts could do most of the work, I thought, so I’d only need to worry about the things that those scripts couldn’t do.

As a side note, another thing I should talk about is the state of learning 3D rigging circa 2005. Highend3D was the go-to place for free (and some paid) MEL scripts, while CGTalk was the forum favored by professionals, students, and hobbyists alike. For Maya tutorials, The Gnomon Workshop was king, but also expensive. Digital Tutors had only been around for 4 years, and even years later their Maya materials were pretty basic. Even with all of these resources available, it was something of a Wild West setting, with standards and workflows still being hammered out.

Once I’d finally animated Mary, I started to realize how just limited my rigging knowledge was. Because I worked in games, I’d essentially built a game-like rig, which wasn’t good enough for me. I wanted a feature-film quality rig, even if I had no idea what that actually meant.

It also didn’t help that cartoony 3D animation was still more or less in its infancy. The Incredibles had just been released in 2004, and that was the first film where Pixar was confident that they could animate a cast of humans without it being off-putting.

Dreamworks took cartoony 3D to a new level in 2005 – the same year I debuted Mary’s model! – with Madagascar. And in 2008, they would push the bar higher again, with Kung Fu Panda. Unfortunately, seeking answers for how they did it would be pointless, because, like Pixar, Dreamworks uses entirely proprietary software to make their films.

Searching For A Secret Ingredient

After the release of Sony’s Open Season in 2006, I’d read about how they created a custom “shaper” plugin, which allowed them to reshape the characters’ silhouettes to create stronger poses. This – and others – convinced me that there was always some secret ingredient that I was lacking, which prevented me from getting the results I wanted…

Sony’s Shaper deformer had inspired me to try to rig something similar in Maya. I knew that Maya could use use geometry in the place of bones as skin influences, which could allow for some degree of animated sculpting. While it worked, and building it was educational, setting this up on a full character would’ve been too time consuming at the time. A script would be needed, but I had no idea how to write it, or any desire to learn to do so.

Shortly after Ratatouille’s release in 2007, Pixar shared a white paper on a “harmonic coordinates” deformer they’d written for the film. Within a year, that paper was used to add a cage deformer to Blender, which was then put to use on Big Buck Bunny.

Also in 2008, Daniel Martinez Lara introduced his AniSculpt script for Blender, which allowed animators to sculpt corrections & adjustments on top of their animated rigs, to achieve deformations that the rigs otherwise wouldn’t be capable of. Four or five years later, I would learn that this was the exact same technique that was used – and continues to be used – by animators at Sony to achieve the super-cartoony poses in the Hotel Transylvania films. In the years in between, I was convinced that there had to be some better option that was out of my reach…

Journeying Into Code

The more I learned about rigging, the more I feared I’d need to learn how to script. I didn’t want to. Scripting was beyond me, and would pull me even further away from animation, I thought. Eventually it became unavoidable.

By the end of 2009, Daisy’s first rig was nearly finished, only by then I’d realized that I’d made her too tall. After stripping off all of that rigging so I could fix her, I’d decided that I couldn’t avoid learning to script any longer. The rig I’d built for her arms and legs was too complicated to build by hand over and over. It was difficult enough keeping everything consistent between all four limbs; doing so between multiple characters was even more stressful!

Fortunately, the Maya community has no shortage of free scripts available to be used as reference, and questions could always be asked – and quickly answered! – on sites like CGTalk. As difficult as I thought it’d be, at least there was a wealth of resources available.

By 2011, I was confident enough in my scripting abilities to write my own rigging tool. It… wasn’t very good, to be honest. If I remember correctly, joints had to have specific names, because I hadn’t yet figured out how to use variables.

Eventually I’d focused on writing a rigging script for one part in particular – limbs. That script and Rose were my main personal projects for 2013. As much as my “Limb Tools” script sped things up, though, it still wasn’t enough, because it still took a fair amount of hands-on work to attach it to the rest of the rig. It also had so many options, that I had trouble remembering which ones I wanted to use on my rigs…

too many options!

As a side note – One thing I still kick myself over, is not switching to Python sooner. After Python support was added to Maya, it quickly took over, especially after PyMel was integrated. At the time, I resisted the change, because I was only just starting to understand MEL. I didn’t want to start over with another language!

Gradually, I would start to learn Python. At first I focused on the differences and similarities between it and MEL, and even ported some of my tools. I didn’t fully commit to it until the end of 2016, though.

A Rose By Any Other Name…

In 2013, I’d decided to model & rig Rose. I still had no idea how I’d rig Daisy’s breasts, so it made sense to focus on a character where that would be a non-issue. It also gave me a chance to implement everything I’d learned from picking apart AnimSchool’s Malcolm rig, after they’d made it available. Malcolm’s face rig in particular was highly educational, and the fact that the person responsible for it had worked at Blue Sky made it even more appealing to me.

New Skills, New Challenges

Late in 2014, I’d decided to model & rig Violet. Like Rose, she wouldn’t have any of the problems I’d face with Daisy. Unfortunately, she had a whole new set of problems I hadn’t anticipated!

The first problem with Violet, is that she has big, non-spherical eyes. I knew how to rig spherical eyes so they could stretch, but eyes that were stretched by default were beyond me.

The next challenge with Vi, is that she doesn’t have a chin or a jaw line; her face just tapers into her neck. Would sculpted blendshape expressions hold up? I didn’t think so, so I more or less abandoned rigging her.

Some time between the end of 2016 and early 2017, I’d finally come up with a solution – her face could be rigged with joints instead of blendshapes, and those joints could slide on top of a simpler surface representing the volume of her face. I’d even written a script to set this up for the eyelids, but by that point I was too focused on Daisy again.

Plans Finally Coming Together…

In 2016, I’d finally decided it was time to rig Daisy’s new model. But instead of doing so by hand and constantly saving my progress, I’d decided to script everything. I already had MEL scripts to rig each of her body parts – minus her face and breasts – so this new script could simply run those commands, and combine the results.

About half-way through the year, I’d realized how wasteful this was – the script would only work for Daisy. Why not make replace the hard-coded object names with variables, and give the script a UI, so it could be used on other characters?

As I wrote this new rigging tool, I didn’t want to take any risks with Daisy’s file, and chose instead to work on another side project. This time I was entertaining the idea of doing adult Warcraft animations, but with characters redesigned based on my drawing style. And how could I not start with gnomes?

By the end of the year, I’d lost interest in this project. My rigging tool was working, so I thought it best to focus on Daisy again. Since she’s my own character, at the very least I wouldn’t have to worry about anyone shutting me down over copyright issues.

…and Falling Apart Again

While my new “rigCore” script could rig a full, bipedal character, it still had some severe limitations. It couldn’t rig faces or Daisy’s breasts, or any custom parts; the parts it could rig were fairly rigidly defined, and it could only rig everything all at once. For faces, at least, I thought I’d write a separate rigging tool. Once I’d learned how to rig faces in a way I liked, that is.

I don’t know what all of this does, anymore…

Something I wanted to avoid this time, was having to create dozens of blendshapes. Up until this point, that was the only way I really knew how to rig faces – I’d used them on Mary, Daisy’s first model, and on Rose… I didn’t want to create a whole new set.

One problem with blendshapes is that if the base model changes, then you need to update all of those targets as well. With a joint-based rig, if/when the model is updated I could, in theory, simply rebuild the rig. But since I’ve never built a high-end joint-based face rig before, and haven’t had access to any I could pick apart, I’ve been approaching it very cautiously, fearful at every step that I might get things wrong and have to start over.

Between December 2016 and January 2017, I’d started writing new scripts to help with face rigging. But where rigCore had been written entirely in MEL, for these new tools I decided it was time to switch to Python. If nothing else, dictionaries quickly proved to be a much more practical way of returning all of the objects created by the script.

One of my first face scripts was an eyelid rig based on a tutorial by Marco Giordano.  While similar to the eyelids on AnimSchool’s Malcolm, Marco’s rig proved to be easier to automate, as it didn’t rely on predefined poses driven by box sliders.

For the rest of the face, I’d settled on joints driven by ribbons, and quickly wrote a series of scripts to set them up. To help drive the ribbons, I borrowed an idea from one of the games I’d worked on, and created a low-poly “mask” to attach the ribbons to.

Where my face rigging progress stalled out, was in figuring out how to make all of these tools easier to use. As with the body, I’d written a Daisy-specific script to quickly test these tools out, but I didn’t think I could write a UI that would work with all characters. Compared to Daisy, Mercy and Rose might need additional controls, while Violet’s rig would be entirely different.

The only solution I could think of, was that I needed my tools to be more modular. I just had no idea what that meant, and it would take me the rest of the year to figure it out.

2018 – Progress At Last?

It seems like I accomplish more over the Christmas break than at any other point of the year. Even when I’m having a slow year, with far too much free time between contracts, at the end of the year there’s a sense of urgency, because who knows if the next year could be much busier?

At the end of 2017, I’d decided to tackle another Python problem I’d been avoiding – how to write UIs. At first I thought I stick with MEL for my interfaces, until I found out that getting a MEL UI to pass information to Python commands was far more difficult than I’d expected. No, it would be easier to just learn how to write the interfaces in Python. As an added bonus, this helped me to finally understand Python classes, something I’d been struggling with for the past year!

Early in 2018, I had to put what I’d learned about Python to use. A new contract would have me rigging and animating characters in Maya, for the mobile game Dragonvale World. To keep out rigs consistent with theirs, the client was originally supposed to provide us with their rigging tools, only when the time came, they had not.

At first I thought I’d use my own tools, but that wasn’t feasible. RigCore couldn’t be used for these characters. My limb script on its own was useless, as the rig was more complicated than what this job needed, and it was too poorly documented for me to write a new script to interface with it.

Instead, I took what I’d learned about Python classes, and quickly hacked together a new, class-based limb rig, which was also far easier to set up!

Along with the limb, I’d also written a simple FK class. Those two components were all that were needed for our first test character. The rigged components still needed to be combined by hand, but the rig was simple enough that that didn’t take too long.

Time to celebrate!

By the time the contract resumed a month or two later, I’d added more classes to my arsenal, including including spline-IK and ribbon modules! I’d also used the time between the two phases of the contract to finally build the breast rig I’d been planning for Daisy, and used that as a way of experimenting with class inheritance.

After that contract ended, I’d started working on a template for the rigs. Combining the parts by hand had gotten repetitive and tedious, and it was nerve-wracking keeping everything consistent. Since every rig had certain things in common, creating a template actually wasn’t too difficult. Unfortunately, the contract was cancelled, so there’s no reason for me to finish that template. Still, it could serve as a guide for other templates…

And Now Some Words About Breasts

Let’s rewind again to 2005. One of my goals for Mary-Anne, was simply to create a cartoony, 3D-animated pinup girl. To me this meant that her breasts needed to move, but not through the use of a jiggle deformer, which are too limited. Instead, I’d settled on sculpted poses, since my rigging knowledge at that point was limited mainly to blendshapes.

While Mary’s blendshape-based breast rig worked, it was limited. Because I wasn’t using a jiggle deformer, any jiggling had to be animated by hand. And there wasn’t any way to push them beyond those predefined poses. It needed something more…

In 2009, my rigging skills were at a point where I had devised a new rig for Mary. Rather than sculpted blendshapes, this one would use a spline-IK chain to drive each breast. I’d even figured out how to transfer the jiggle from a hidden polygon object onto the spline controls, in such a way that I could blend the effect on and off!

Unfortunately, that version of Mary’s rig had many problems, so no matter how good the breast rig might’ve been, ultimately it went to waste. More importantly, as flexible as the breast rig was, it still couldn’t have been good enough for Daisy.

Sometime after nCloth was added to Maya – 2014, perhaps? I’d attempted to use that to make Daisy’s breasts dynamic & squishy. While it did show some promise, there were simply too many settings that affected the simulation, and, from what I’d read, those settings would need to be adjusted on a scene-by-scene basis. Complicating things further – how might I get manual control, in addition to the dynamics?

In 2016, Stefan Ehrenhaus gave an in-depth tutorial on nCloth breasts. As illuminating as it was, would it help with Daisy? Perhaps. By this point I’d already had an idea for a layered, non-dynamic breast rig, and the way Stefan’s rig worked, it could be added in as an additional layer!

Mid-way through 2018, I finally built the breast rig I’d been planning for Daisy. The base layers of it, at least. It had been worked out in my head for years by that point, and in theory it would work, but now I had to build it to be sure! (SPOILER: it did!)

This rig is the culmination of everything I’d learned and attempted so far. Taking inspiration from the rig I’d given Mary in 2009, this one uses ribbon-IK for is base level of control. Each edge-loop on breasts has its own center bone, but is encircled by eight more bones that serve as sculpt controls.

2019 and Beyond

Will 2019 be the year I FINALLY finish Daisy’s new rig? I can’t say. As I type this, I’m starting another Christmas break by working on Python scripts that I haven’t touched in months. Once my new limb script is finished – a class-based replacement of the one used by rigCore – I’d like to replace rigCore with a template, similar to what I’d started for Dragonvale World. Unlike rigCore, this new tool may have room for accessories, and if needed it can be expanded upon through inheritance!

Even face rigs are less of a mystery, now. Two years ago, I worried about how I might write a tool that could rig each of my characters’ faces. Now? Daisy’s face rig could serve as another template. If another character – like Violet – needs drastic changes, they could simply use a new template that inherits from and builds upon Daisy’s.

After years or learning both rigging and scripting, everything may finally be coming together…  which in my experience so far, means it’s also very close to falling apart again. We’ll just have to wait and see.