Senior Technical Artist - PlayStudios

At PlayStudios I have been working with the team to improve the pipeline for the mobile games. This includes assisting with the technical challenges of asset development and defining the proper hand-offs between the teams. One challenge that I had a great deal of fun solving was the animations for one of the characters in Crystal Planet. In the mini-game the Art Director wanted to have a small dog [featured below] mining for ore, in space. I helped bring his vision to life with a Maya Rig for the 2D Character. This allowed us to ship the character in less than 1MB in comparison to the 12 MB required for the frame by frame animations. This not only gave us a more flexible performance but allowed us to take advantage of Unity's Mechanim animation blending. This combined with other efforts allowed the game deploy size to be reduced from 20MB to 7MB as a patch on the myVegas mobile game (iOS & Android). myVegas Crystal Planet


The breakout of the character.

To assist with rigging the character I created the following script which made it easier to setup stretchy limbs to help get a more squish-able cartoon feel.

"""
From three selected object A, B, C
the distance between A and B drives the scale of C
Automates the expression setup
"""
import pymel as pm
import maya.cmds as cmds
import math
# distance between selected
for node in pm.core.ls(selection = True):
    print node.translate.get()
    print node.outputs(connections=1)

def distance(x1,x2,y1,y2,z1,z2):
    sq1 = (x1-x2)*(x1-x2)
    sq2 = (y1-y2)*(y1-y2)
    sq3 = (z1-z2)*(z1-z2)
    return math.sqrt(sq1 + sq2 + sq3)
    
def nodeDist(node1, node2):
    t1 = node1.translate.get()
    t2 = node2.translate.get()
    return distance(t1[0],t2[0],\
                t1[1],t2[1],\
                t1[2],t2[2])

def expDist(node1,node2):
    # create a distance equation from the two nodes given and return it as a string.
    nodes = [node1.name(),node2.name()]
    axes = ["X","Y","Z"]
    equation = "sqrt("
    for axi in axes:
        axi = "translate" + axi
        eq = "(" + nodes[0] + "." + axi + "-" + nodes[1]  + "."+ axi + ")"
        equation += eq + "*" + eq + "+"
    equation = equation[:-1]+ ")"
    print equation
    return equation
                
if __name__ == "__main__":
    sel = pm.core.ls(selection = True)
    for each in sel:
        print "[Name]" + str(each.name())
    size = nodeDist(sel[0],sel[1])
    cmds.scale(size,size,size, 'nurbsSphere1',absolute=True)
    exp = expDist(pm.core.general.PyNode(sel[0]),pm.core.general.PyNode(sel[1]))
    target = sel[2].name()
    cmds.expression(o = '%s'%(target) , s ="%s.scaleX = %s"%(target,exp))
    cmds.expression(o = '%s'%(target) , s ="%s.scaleY = %s"%(target,exp))
    cmds.expression(o = '%s'%(target) , s ="%s.scaleZ = %s"%(target,exp))

During the development of CaddyShaq I assisted with the rigging and animation integration into Unity. This involved cleaning up outsourced rigs for the game engine and ensuring that animation data was properly exported. I set up the animation trees and worked with the engineers to ensure that content functioned as expected, making occasional code changes (C#) to resolve esoteric issues. During the final stages of the project to ensure that the web and mobile platforms had the same game flow I created flowcharts with a member of the engineering team to map out the game states and expected results. Working with the artists and engineers we were able to reduce the deploy size from 40MB to 10MBs and maintain the majority of the content quality. To help analyze the game size I created some utility scripts to scrape build logs and help identify over size assets (or types of assets).