Game Jam | Groove in the Grove

We’re doing a game jam with some friends for fun also as a way to test the pipeline and tools.

You can download and play the game from here.

Challenge

The challenge was to make a game with this color scheme as the starting point in two weeks.

Our initial brain storm went something like:

  • Night, day colors…
  • Looks kinda like a xylophone
  • Music game
  • We have Morphy Kid
  • Little kid + Music ….

Synopsis

Musical beat game where a little girl learns to groove with some forest friends.

Crew

2019

We’re using this jam as a way to test Maya 2019.3.1 for production as well. It’s been fine for rigging and other work but we hadn’t really done production work yet.

We found a lot of crashing for minor things even with the cache off. Reached out to some fellow tds and got some ideas from them we’re messing with.

From Jerome.

def setup_cache_evaluation_settings():
    """
    Set specific settings to the Cache manager and EM in Maya
    """
    # disable some EM evaluators
    cmds.evaluator(name='transformFlattening', enable=False)
    cmds.evaluator(name='pruneRoots', enable=False)
    cmds.evaluator(name='deformer', enable=False)  # GPU OVERRIDE
    # cache evaluator import
    from maya.plugin.evaluator import cache_preferences
    # To set Evaluation Cache
    cache_preferences.CachePreferenceMode().set_value("evaluationCache")
    # set caching on
    cache_preferences.CachePreferenceEnabled().set_value(True)
    # cache fill on
    cache_preferences.CachePreferenceFillType().set_value("syncAsync")
    # cache direction
    cache_preferences.CachePreferenceFillDirection().set_value("bidirectional")
    # frame skipping
    cache_preferences.CachePreferencePreventFrameSkipping().set_value(True)
    # discard frames outside range
    cache_preferences.CachePreferenceDiscardFramesOutOfRange().set_value(True)
    # cache smooth meshes
    cache_preferences.CachePreferenceCacheSmoothMeshes().set_value(False)
    # memory limit
    cache_preferences.CachePreferenceMemoryThreshold().set_value(70)
    # display memory HUD
    cache_preferences.CachePreferenceHud().set_value(True)
    # display warning frames
    cache_preferences.CachePreferenceShowWarningFrames().set_value(True)
    # display warning messages
    cache_preferences.CachePreferenceShowWarningMessages().set_value(True)
    # display cache status
    cache_preferences.CachePreferenceShowCacheStatus().set_value(True)

 

From Marcos.

cmds.cacheEvaluator(newFilter='nodeTypes',
newFilterParam='types=-constraint,+transform,+nurbsCurve,+bezierCurve,+nurbsSurface,+subdiv,+lattice,+baseLattice,+cMuscleDebug,+cMuscleDirection,+cMuscleDisplace,+cMuscleDisplay,+cMuscleFalloff,+cMuscleKeepOut,+cMuscleObject,+cMuscleSmartCollide,+cMuscleSpline,+cMuscleSurfAttach,-THlocatorShape,+locator,+light,+camera,+imagePlane,+clusterHandle,+deformFunc,+hwShader,+pfxGeometry',
newAction='disableEvaluationCache')

Girl

We decided to use Morphy Kid as our character as we have it. First took a look at the character.

  • Didn’t need the face rig and wanted to try simple pupil eyes so modded the face with a smile
  • Decided on a little girl look so just picked one of our hairs

 

 

 

Offset

Using the Junior variant as it was our furthest version of LBS asset along. I wanted to try some different proportions for this character for a couple of reasons.

  • The junior asset was different already
  • I had some issues with some posing with the original base I wanted to try differently – namely longer legs for better action pose possibilities
  • The Junior asset was scaled down .83. The offset for the body stuff ended up being – move -r 0 4.930929 0

  • The drum is a shaper list Handle block
  • Toon setup on to test things

Animation

FBXs

We’re using a 3d animation moveset controller which we need to match. The FBXs don’t have joints which makes it hard to use them for evaluation. Wrote a little call to make it easier to see after I selected the dags.

for mObj in cgmMeta.asMeta(sl=1):
    mSphere = cgmMeta.asMeta(mc.polySphere(radius=2.0)[0])
    mSphere.p_parent = mObj
    mSphere.translate = 0,0,0
    mSphere.rotate = 0,0,0

Idle/Base

Starting with the idle with a few goals

  • Figure out drum hold pose
  • Get base timing

First pass.

Walk

  • Timed to beat still. Needed 36 frames for good beat sync
  • bit of a march

Walk in Place

  • Quickly modified walk in place
  • Hand hovering now rather than matching beat

Run

  • Quickly modified walk | 16f cycle to match beat
  • For fast pass, just halving the rotates on the head and torso stuff helps tone it down

Intro

We needed an intro animation for our little game slice. This was the blocking pass on it. We won’t have time to polish a lot so it’ll be a fast pass on it.

Critters

Bokser did a really cool workflow I wanted to try to emulate on the owl. He’ll do a tutorial when he has a bit.

General idea is:

  • Only simple motion on the root
  • Use animation filters on animation layers for the rest or other parts.

Digging in…

Owl

Quick pass. About 2 hours.

  • Mainly done on anim layers
  • Main animation on the cog on the base anim
  • Did side to side with animDraw to get some texture
  • Bank cycle
  • Wing flap to beat
  • Springs on head, tail, legs
  • Drag on brows and wing layer to get some follow
  •  Head
    • Spring | 7 | .6 | 1 | .1 | 50

Bit more polish…

 

After some talking decided that the owl would be our end character so we made a couple of different sleep states for it.

  • 2 new anims
  • Added simple lids with some blendshapes.

Sleep

Default state

Sway

After you have an animal friend he goes to this state.

Humanoid Rig

After the first pass, turns out we need to make some mods to make things work with the unity humanoid rig – namely turning off all scale constraints and most points.

We probably need to just setup a humanoid actor template for use, maybe a buildProfile.

Specifically translation allowed on:

  • Chest
  • UpperChest
  • Neck
  • LeftUpperLeg
  • RightUpperLeg
  • LeftShoulder
  • RightShoulder

After this I went back and updated the base animations since the legs would no longer stretch. For a fuller game if we like how this turns out we’ll go back to the old setup.

Learned…

  • With the controller we used you needed to unlock the y motion to say it was baked in. Otherwise the anim was really flat
  • Polishing with animations hooked up in game is always better than just doing it in Maya

Animals

  • We needed some fast animals so we bought a pack off the unity store
  • Rerigging them quickly with MRS

Frog

First of the animals.

  • Tried a clav for the first leg segment to have more control of that upr leg….it did NOT work well
  • Quad leg worked best
  • Front leg | bug fix for nub handle with two controls to have pointConstraint as well

LIMB | Aim setup with two handles

Want an rp setup on this. The up vector on the end handle is too inconsistent.

Rabbit

First of the animals.

  • Spine – single joint HANDLE
  • Head – single joint HANDLE
  • Ears – single joint HANDLE
  • legs – two joint LIMB nub blocks

After build, changed the head handle from a space setup to a follow.

Bird

  • Spine – single joint HANDLE
  • Head – single joint HANDLE
  • tail- single joint HANDLE
  • wings – single joint HANDLE
  • legs – two joint LIMB nub blocks

Sometimes you need a geo picker to toggle geo options. We have a call that does it off the first level of children in a group.

import cgm.core.classes.NodeFactory as NODEFAC
NODEFAC.build_conditionNetworkFromGroup('geo', 'bird', 'settingsControl')

Owl

  • Spine – single joint HANDLE
  • Head – single joint HANDLE
  • tail- single joint HANDLE
  • wings/brows – single joint HANDLE each
  • legs – two joint LIMB nub blocks

With the basic setup done. New rig setup has been pretty quick. Used the bird rig I did the night before as a basis. This rig with skinning took about an hour with a couple of builds testing things.

Post Mortem

What worked

General

  • Color palette | The limitation initially was chaffing. However in the end the limited scope forced us think about careful use of value to separate things.
    • I used the darker grass on the outer edges of where I didn’t want the player to go do.
  • Having good audio pretty much first day was huge

Maya

  • MRS held up great
    • Testing frog leg length was great before committing
    • Held up really well for low joint setup and for quick turn around
  • Scene was great for management and export
  • AnimDraw was great
  • Pose Lib worked well
  • Anim filter was really fast to work
    • Need to do vid
    • Anim layers were fantastic. Probably don’t need special layer support in the tools

Unity

  • Environment kit was great
    • For initial testing
    • Then made set dressing very intuitive (took about a day after design was done)
  • Able to get appealing look relatively easily

What Didn’t

Maya

  • AnimDraw
    • Needs audio support
  •  Scene
    • Mayapy not working right
    • Export options need to be part of project and load
  • 2019 was buggy.
    • GPU override helped with lockups

Unity

  • Inconsistent user experience with controller vs keyboard
  • Trying to learn too many off the shelf assets was challenging
    • vector character controller
    • Rhythm starter kit (ended up not using)
    • Limitations of Humanoid controller
      • Not allowing humanoid
      • Translation only on a few joints (start of limb)
      • TO DO –
        • additionally testing on scaling
        • Mask
        • Maybe we can use scaling with more testing
  • Josh – needs to learn more animation implementation setup

Josh Burton

[MRS Project Lead | CG Monks] Josh is an animator turned TD who hails from Oklahoma, pre-undergrad in the Marine Corps, animation basics at Savannah College of Art and Design, cut his teeth in gaming and commercials before co-founding CG Monks and more recently the CG Monastery. The Morpheus Rigging System is a culmination of years of R&D and he is now thrilled to see what users can create, collaborate and expand on with this open source MRS platform.