Skip to main content
Jeremias Meister - Tools & Pipeline
SEED Animation Tool Suit

SEED Animation Tool Suit

The Maya animation pipeline for Klang Games. Handles the entire animation creation pipeline on the Maya side.

Overview

The Maya Animation Pipeline, which I developed for Klang Games (https://www.klang-games.com/), provides many tools and utilities to make the animator’s life easier. The Pipeline can be installed solely by dragging one installation script to the Maya viewport. It is connected to git, making one-click updates possible. Also, the Pipeline supports multiple rigs in one maya scene, managing them with relative namespaces entirely in the backend, making it easy for the animator to animate numerous characters quickly. The animator can store, apply and save poses and animation clips. The entire body or also partial selection mirroring of poses is supported. Another feature is, that the Pipeline takes care of loading, handling, and exporting of characters as well as all the shading and texturing with either Maya blinn shading or custom cgfx/ogsfx shading.

My role: I created the base of the tooling suit, the backend and the majority of the tools. It is a collaborative work where all Technical Artists at the company contributed to at some point.

Complex Multi Actor Animation Scene.

Deep Dive

A few pieces of the backend that I’m particularly happy with. Each one solved a problem that kept resurfacing across every tool in the suite.

Controllers that describe themselves

Nothing in the pipeline hardcodes rig naming conventions. Instead, every animation controller carries boolean tag attributes: isArm, isLeft, isFK, isWrist; The tools query the rig by intent rather than by name. A single helper walks the controller display layer and filters on those tags, with ! meaning “must not have this tag”:

def get_controller_by_attribute(*args, long_name=True):
    all_ctrls = cmds.editDisplayLayerMembers("all_ctrl", query=True, nr=True, fn=long_name)
    ctrl_list = []
    for ctrl in all_ctrls or []:
        keep = True
        for arg in args:
            if arg.startswith("!"):                         # negated tag
                if cmds.attributeQuery(arg[1:], node=ctrl, exists=True):
                    keep = False; break
            elif not cmds.attributeQuery(arg, node=ctrl, exists=True):
                keep = False; break
        if keep:
            ctrl_list.append(ctrl)
    return ctrl_list

That turns a set-membership question into a readable query: get_controller_by_attribute("isFace", "isLeft", "!isBrow", "!isEye") reads like the sentence it is. Because it’s tag-driven, the same tools work across every character rig in the game without a single per-rig special case; a new rig just needs its controllers tagged.

Mirroring by reflection, not by rules

Pose mirroring is where naïve implementations drown in special cases: negate X here, subtract 180° there, per controller, forever. The core of the SEED mirror instead builds a proper reflection matrix across a controller’s mirror plane (a Householder reflection, R = I − 2·nnᵀ), so a mirrored transform is just a matrix multiply:

def reflect_by_plane(self, plane_normal):
    plane_normal.normalize()
    m = list(om.MMatrix())                     # identity, flattened
    out = [m[i:i + 4] for i in range(0, 16, 4)]
    for i in range(3):
        for j in range(3):
            out[i][j] -= 2 * plane_normal[i] * plane_normal[j]
    return om.MMatrix(list(itertools.chain(*out)))

The geometry does the heavy lifting; the tag system handles the rest. Rather than encoding a rule per controller, the mirror only applies small, categorical rotation corrections. Hands, FK legs, and spine/center controls each get one axis flip, keyed off the same isHand / isLeg / isFK tags. So the messy part of mirroring shrinks to a handful of branches instead of one per bone.

For obvious reasons the tooling is internal, and all screenshots and code shown here belong to Klang Games GmbH. The snippets above are trimmed excerpts included to illustrate the techniques, not the full implementation.