Zombie Playground’s Character Pipeline: Designing a Modular Rig Solution

With a greater number of potential characters than Mothhead, our previous Unity project; I went into Zombie Playground’s pre-production with my mind already set on creating an automated rigging solution. I took some inspiration from a Modular Rigging course I followed on 3dBuzz and begun to break down my rigging process into object-oriented code in suite I named Automato.

class BaseSubstruct(object):
    '''
    Abstract class to derive new rig modules from
    '''
    NAME = 'abstractobject'
    NICE_NAME = ''
    CREATION_PARAM_JSON_ATTRNAME = 'creationParams'
    DESCRIPTION = 'generic abstract description'
    MIN_JOINTS = 1  # number of joints needed to create substruct
    REQUIRES_SKELETON_CHAIN = True  # if true, subsruct requires a skeletal chain for creation

    def __init__(self, basename, joints, parent, mainControl):
        '''
        Builds rig in maya and creates an asset node to contain relevant nodes
        '''
        self.container = None
        self.layer = None
        self.containedNodes = list()
        self._rigControls = dict()
        self.lockAttrs = list()
        self.basename = basename  # unique name to identify nodes created by this substruct
        self.parent = parent  # parent to attach top-most rig node
        self.joints = joints  # base skeleton joints to attach
        self.mainControl = mainControl

        self.mainColorAttr = None

        if self.parent is None:
            self.parent = self.joints[0].firstParent2()
            if self.parent:
                self.parent = pm.PyNode(self.parent)
            else:
                if mainControl:
                    self.parent = mainControl

        self.verifyParams()
        self.container = pm.container(name='_'.join([Prefix.CONTAINER, basename, self.NAME]))

        ## Parameter dictionary for storing settings for assets
        ## Children classes can further expand this dictionary with parameters of their own
        self.paramDict = {'classname': self.NAME,
                          'basename': self.basename,
                          'joints': [str(i) for i in self.joints],
                          'parent': str(self.parent),
                          'mainControl': str(self.mainControl),
                          'container': str(self.container)}

        pm.addAttr(self.container, dataType='string', ln=self.CREATION_PARAM_JSON_ATTRNAME)
        pm.addAttr(self.container, at=int, ln='color', min=0, max=31, defaultValue=0, keyable=False, hidden=False)

        self.mainColorAttr = self.container.attr('color')
        self.mainColorAttr.showInChannelBox(True)

        if self.layer is None:
            self.layer = Layers.getLayer(Layers.ANIMATION_CONTROLS)

        self.transform = self.install()
        utils.lockAndHide(self.lockAttrs, True)
        connectControlColors(self.rigControls, self.mainColorAttr)
        self.updateSelectionSets()

        self.layer.addMembers(self._rigControls.values())

        self.containedNodes.append(self.transform)
        self.containedNodes.extend(self._rigControls.values())
        self.container.addNode(self.containedNodes)
        self.containerPublish(self.container)

        self.saveCreationParams()
        pm.parent(self.transform, self.mainControl)

    @property
    def rigControls(self):
        return self._rigControls.values()

    def verifyParams(self):
        if self.REQUIRES_SKELETON_CHAIN and not checkJointsAreHierarchy(self.joints):
            raise SkeletonError('The specified joints must be from the same skeletal chain')

        if len(self.joints) < self.MIN_JOINTS:
            raise SkeletonError('Only works with {0} joints!!'.format(self.MIN_JOINTS))

    def install(self):
        '''
        Main juice function
        Basic rig framework is created
        Return the top-most group node for __init__ method to utilize
        '''
        raise NotImplementedError("Derive me please")

This is a small snippet of the base class I designed all the rig components (known as “Substructs” in my code) to derive from. The BaseSubstruct class contains a set of parameters stored as members that most, or all, of my rigging structures (leg, arm, etc.) share. Using a OOP approach to creating the rig makes for a very scaleable solution for our pipeline. As new creatures are designed and implemented; I can plan out the automation right away, simply making a new class with most of the ground work derived from the original base class. Continue reading

A Look at the Beginnings of Zombie Playground’s Character Pipeline

Zombie Playground is an exciting project I’ve been working on in recent months. Even though this was the second project where we are using Unity3d (the first being Mothhead); this is a completely brand new IP for us, that isn’t tied down to maintaining legacy assets. As such, Zombie Playground offers us a lot of freedom in planning out an efficient pipeline so we can better concentrate on the vision of the game, and less on tedious tasks. I’m responsible for wrangling our said pipeline, documentation, character rigging, and developing tools to assist our small team. We’re still in the early stages of development, and there’s a lot of aspects of the project in WIP-phase, but I want to describe some tools I’ve developed for ZPG that have been coming along nicely.

Continue reading

Time Lapse – Bat Skinning

[vimeo 34571923 w=640&h=385]

Skinning pass, at mega-speed, made to a bat rig.

I worked on this guy about 2 years ago. Originally planned to use this footage as a skinning tutorial but i never got off the ground fully. With all this footage I decided to try speeding the entire process and see how interesting it looks.

Modeled by Shon Mitchell.

For more information about the rig, and to see it in action, check my previous post!

Bat Rig

A bat rig I did at Massive Black for use in an animation lecture. The bat features IK/FK switching on the arms and legs and some extra layers of control to deal with gimbal locking. The wings were quite fun to skin in a masochistic sort of way. The bat was modeled by Shon Mitchell and animated by Chris Hatala.

UPDATE: here’s the flight cycle, animation by Chris Hatala.

Dead to Rights Retribution Trailer

Been hiding for a few months, but I’m starting to roll out some new stuff. Check out this trailer for the upcoming Dead to Rights: Retribution. It features a few characters I helped skin for Volatile, notably the female in the diner and some of the baddies that get their arses handed to them. I wish I got to help out with the dog, Shadow. The game is looking really awesome and looks like people are getting excited!

Continue reading

The Saboteur

Official Box Art

The Saboteur was a pleasant sleeper hit that came out this past holiday season. I helped rigged the main character, Sean Devlinn, using Softimage|XSI. This was the first serious project I’ve done in XSI, and I struggled with some of the quirks. In the end, it turned out great and its the first protagonist I’ve had the opportunity to work on in a game.

Eat Lead: The Return of Matt Hazard

Just got word that I got credited as a Rigger for Vicious Cycle’s latest game, Eat Lead. I skinned some of the enemy characters for the game, using 3ds Max. Massive Black also did some of the other NPC models and textures.

Big shout out to Vicous Cycle for this project; it has a nice charm to it. I recommend everyone to check it out

Bioshock 2

Game Informer Cover

Game Informer Cover

Just got word that Game Informer is releasing this cover. 2K Marin hired us at Massive Black this past Janurary to create a setup a high-res verision of their in-game model of the Big and Little Sister. They supplied us with the original rig and assets. After collabaorating with our Shanghai branch to ensure the high res model was built similar to the game-res 2K sent us, I had transfer the high res model onto the game-res rig and skin it. One very neat thing about 3ds Max is it’s ability to make a wrap deformer and “bake” it into a skin for faster manipulation. After the bake, I simply edit any weights and polish the deformations.

Afterwards, I handed it off to our Animator, Chris Hatala, to pose and render the image who passed it to Jason Chan, to paint over the render in Photoshop.

Massive Black Commercial

UPDATE: Now have a video of the monster I rig by itself. I moved the video of the full commercial after the jump.

We did a pretty funny spoof commercial to advertise our company. I’m featured in one of the last shots and the very last shot is a creature I rigged a while back in Maya. I highly recommend checking out the HD version, if you can.

Continue reading

Massive Black: Volume 1

Check it out!

Check it out!

Whew! It’s been a minute since my last post.

Massive Black: Volume 1 is an art book from my company and not only contains some of the most inspiring concept art out there, it even features a few of my rigs in action in the Intellectual Property section.  The book’s been well-received thus far and receiveing mention around the web.

I’m proud to be a part of this talented company and here’s hoping that we can make Volume 2 even better!

Massive Black: Volume 1 is published by Ballistic.

CGSociety Feature – The Art of Massive Black

Kotaku Article – The Art That Launched a Thousand Games, Now a Book

Gamer’s Daily News – Massive Black Launches Art Book Volume 1