"Relicts" Director Arkadiy Demchenko presents a breakdown of his “Modular Character Pipeline” technique: a method that allows himself alongside other freelancers and contributors to all work on one character in unison – and in pieces.
A single character in "Relicts" is the result of a collaboration of several artists working on a bunch of its parts and tasks. Some are done sequentially, one after another, but others have to be produced in parallel. Besides that, there is a constant flow of little fixes, improvements, and additions to make along the way. To manage the process more effectively, we’ve constructed a character asset in “modules” that exist separately in their own Maya scenes. All these elements are then brought together and connected in a master scene that is used for the actual shots.
Moreover, there are several master scenes, each for different pipeline tasks, including animation, dynamics, and shading, each with data exchange via cache files. Here is a detailed example of this using our “Girl” character.
There are three main versions of the character, all in separate scenes:
This scene has the final rig with all the joints, controls, deformation corrections, and fast viewport textures. It doesn’t have hair, fur, or anything that isn’t necessary for animation and can slow things down. That’s what an animator works with (we have a simplified scene of the rig where everything is reduced to the absolute minimum – for rough, but real-time work). All this complex rigging data is not needed further down the pipeline (it can even be harmful), so animation results are exported as geometry cache data. We use an Exocortex Crate Alembic plugin for this – it has a “point cache” mode that only stores vertex positions rather than the mesh itself. These positions can be applied to already existing mesh as a deformation – that’s the key difference which is essential for our pipeline (it works the same way as a Maya Geometry Cache, but using an Alembic format comes with other benefits).
This scene has the same character mesh, but instead of the joint rig, it’s driven by the geometry cache we’ve just exported. Upon that mesh, the Maya Nucleus dynamics rig is built to simulate clothes and a braid (via the hair curve that drives the joint chain). It’s a heavy and slow setup that is best kept separate. After making the sim, we export the same geometry cache again.
This scene involves the same character mesh again, also driven by the geometry cache from either the dynamics set up or straight away from animation (if dynamics aren’t needed). Here, we have everything we need for the final rendering – materials, textures, hair, fur, specific render settings, and so forth.
This structure allows us to simplify and speed up the work of each department while passing data along the pipeline in a more organized and safe manner. However, making and adjusting each of these character “versions” still required a lot of work, different stages, and artists. To make it more efficient, we’ve broken down these versions into even more scenes, that we call “modules.” In fact, the animation scene described above is just an empty scene with two other elements referenced in – the body rig and the face rig – connected with only a few viewport textures assigned.
This way, for example, one rigging artist can work on the body while another works on the face without disturbing each other. This helps avoid having unrelated data in their scenes or having to deal with the pain of continually syncing up results. The trick is in connecting these parts, which is, in most cases, not a complicated task at all, as it relies on blend shapes and/or constraints. So, we reference both bodyRig and faceRig scenes into a new one and use blend shapes to insert faceRig meshes into the flow of the bodyRig (at the end of the chain, but before the skinCluster – you can use Inputs List to change the order). Parent and Scale constraints are used to link transformations of the facial controls panel to the body:
FaceRig produces deformed meshes of the head itself as well as eyes, teeth, and even little strips that simulate wetness between the eyelids and eyeballs, and all this is passed to the corresponding meshes of the bodyRig. We’ve used a single blend shape node to handle multiple objects. You can do so by connecting input/output arrays manually (it doesn’t seem to make a big difference though – you can use a node for each mesh without a problem – but one node looks neat). All these changes remain in the new scene as additional nodes and reference edits, so, it’s quite easy to turn parts of the rig on and off. For example, to speed up the rig when you don’t need facial capabilities yet) or make some changes to the rig scenes without updating the full character.
TIP: Did you know that you can make facial blend shape targets on a separated head mesh even though it’s originally modeled as a part of the whole body? You simply need to make sure that the vertex order of the model begins with the head. That’s a very easy thing to do – split the whole body into two meshes the way you need, then select the head as the first object, and the rest of the body as the second and combine them back together. It’s not an issue to merge border vertices (or edges) after that and soften the edges to get rid of the seam. Now the vertex order of the separated head matches that of the whole body, and you can use It as a blend shape target (just remember to disable “check topology” in the blend shape options). Of course, this must all be completed before rigging.
Since these changes are reference edits, they rely on the names of the nodes, so, we need to make sure they don’t change later in production. The advantage of this though is that certain modules can be replaced with alternative ones quite easily (assuming we have a similar structure and the same names of the nodes we connect to). For example, say we’ve started making a facial rig with hand-sculpted shapes, everything has been connected and is working, but later, we developed a new one from scratch (based on scans). Since the whole connection setup is made of attributes linked to blend shape and constraint nodes, we can sap one facial rig with another when needed – the same way we can replace the bodyRig with a simplified, real-time version by changing the reference path.
The rendered version of the character follows a similar approach for loading the hair module. This is probably one of the heaviest elements of the project, so make sure to save a lot of time for lighting tests, just to unload it and use fast polygonal versions instead, until absolutely needed. Here, we use another blend shape to pass deformations from the character to the head that drives hair follicles.
There’s a complication though. Besides Nucleus dynamics setup for hair strands themselves (temples and forehead mostly), the hair module has a dynamic curve for braid joint chain. This joint can be animated manually by an animator on a closely matching polygonal version of the braid, so, in this case, connections get a bit more complicated – we need to connect the main geometry cache to the joint chain. Our solution involves passing joint transformations via polygon cards with follicles attached, but concerning connections between modules, in the end, it comes down to using those same trusty constraints.
Of course, there can be more complex situations where blend shapes and constraints won’t help. One example would be that we have a mask as a part of the bodyRig that needs to deform with the underlying faceRig. It’s done meticulously, connecting facial controls to mask joints via Set Driven Keys.
Eventually, the idea is practically the same – we make different parts of the character as separate scenes, using the same mesh as a base, then reference them into a new scene and link them together with blend shapes, constraints or other methods like SDK, expressions and straight attribute connections. These links are saved as reference edits based on node names that we must maintain throughout production. The whole pipeline can be split into scenes even further, as deep as you need. For example, we didn’t separate Yeti fur for this character, but that can easily be done the same way (and we will probably do exactly that next time).
If you’re interested in "Relicts," want new tutorials/breakdown, or want to support our endeavor, please visit our website and subscribe to our social channels. Feel free to send us any questions regarding this article or other parts of our production.
Wondering what you could make?
START WITH MAYA FOR FREE