Wednesday, July 20, 2005

Consistent Abstraction

Well, I figure it’s time for me to update this blog. I’ve been pretty busy lately between a lot going on in my personal life and the new job. And of course Battlefield 2 just came out to soak up anything remotely like free time that I had left. Harmonix has been pretty cool so far. I’m spread all over as usual, splitting my time between entirely different areas of the development spectrum. Harmonix uses 3ds Max for their art pipeline, so I’ve been grumbling my way through the Maya->Max transition while writing a lot of tools to make the art pipeline go a bit faster.

One of my first tasks there was to create an animation system for the guitar player’s hands in Guitar Hero. It’s definitely been one of the more fun projects I’ve worked on over the years, and I’m pretty excited about how it’s come out. I love it when I can take hold of a system and just build the entire thing myself, from code to art to implementation. It’s a great sense of accomplishment when it’s done, and I find I usually learn a lot more when I have to deal with all of the issues myself.

The original goal was to create a ‘fret perfect’ system that was perfectly synchronized with the music, but the authoring time to create the data which drove it was just too great. So instead, the bulk of the data is procedurally generated from the data already embedded with the music to drive game play. The results, surprising even me, are nearly the same, if not a little better. I used a pretty simple system of data mappings for the interpreter, and tried to create a nice balance between procedural data and authoring data so that things can be coerced into looking great in very little time.

It’s an interesting lesson in perception; with a ‘near perfect’ system, the illusion is somewhat broken because the level of abstraction is not consistent. Here are these highly stylized, expressionistic characters playing guitar with an extreme level of fluidity. Moving to a more procedural system, we loose a level of realism; but we gain a level of consistency with the rest of the game; and in the long run, it seems to have a better effect; and of course, we save tons of authoring time in the process. I don’t think this is the kind of feature that will drive more box sales, but it certainly makes a cooler product, and those that notice is will appreciate the attention to detail.

During the process of creating all the source animation I became innately familiar with 3dsMax’s Biped system. The very sound of its name causes me to gag slightly and choke back down some vomit. While the system promises a lot of interesting features, like being able to port animations from one character to another seamlessly, it makes sure the rest of the work flow is so mind numbingly annoying that you can barely animate with it. And then the interesting features don’t work right either, just to kick you in the face for using it. You can’t keyframe a finger; you have to keyframe the whole arm. You’re animation channels are all tied together as well, so no separate keyframes on separate channels now. You’re kidding me right? People animate with this? It would be faster in claymation!

Anyway, slowly I’m writing tools to replace biped. The features it offers are cool, but I think I can replace most of the interesting functionality that we actually use fairly easy. Probably the most interesting feature of biped is the ability to easily port animations from different sized creatures and have it ‘just work’ (well, that’s the promise anyway; didn’t seem to work for me when I needed to port the hand animations between characters). I’ve already written my own tools to deal with that and they seem to work fairly well. I’m now able to batch process animations across characters and not have to do manual adjustment of the data. Gigidy gigidy..

Hey, anyone have an idea for my GDC presentation this year? Before I left Turbine I was planning on doing something on syncronizing fast-action game play over high latency environments. (ie: Real-time response with half a second of lag) Maybe I'll talk Dan into doing that with me anyway, but if anyone has any other requests I'm pretty open to ideas right now..

Google