As I said on my last post, I was pursuing animation, and guess what: I have it!
Even when I haven’t implemented frames interpolation yet the animations look funny. So let’s start with the usual postmortem of what went wrong.
First I started parsing the md5 anim files, and guess what I don’t like it either. It’s not hard to parse, it’s just nonsense. It starts with a hierarchy and a base frame, well, everything seems ok until here, right? But then you have the frames, defined as a series of floats that, with some kind of obscure craft applied over the base frame and with the information in the hierarchy gives you the skeleton for the given frame. Sure it works, sure it has few data and sure: WHAT THE HELL WERE YOU THINKING OF? I think, honestly, that it would have been simpler to have an skeleton for each frame, easy and simple. Why do people think that being clever is ALWAYS the right way? Sometimes a simpler approach makes life easier :)
Well, once I have it loaded I faced another decision: coupling an animation and a model with a custom file or being a real macho man and loading the doom 3 def files? Obviously I’m a macho and def files was the way to go :).
And what are the def files? Def files for models at least define the entity informatio, in particular you can find there for each model what mesh and animations it uses. I have to say that this is the first file format that likes me :). It’s simple and does what it has to do. For each model defines a mesh and a series of animations, and for each animation what events applies and in what frames. Wonderful! :)
So I made a little loader for it and here’s the result:
WTF!?! I had a correct skinning system! What was happening here? At least I have to say it was indeed animated :)
YEAH! I have videos, thanks to glc capturing application, fraps-like for GNU/Linux. Well, it looked really weird, didn’t it? So I checked the def file and I discovered that it contained 3 imps models, so click click click I just hacked the loader a bit to have them separated and what did I got? Well, this:
Which… well, looked at least strange :) The first 2 imps remind me that Edvard Munch painting: The scream
Well, once they were separated I was wondering what failed, because the only model that was animated was the right-most one, but in fact it wasn’t properly animated but somewhat convulsing :S.
Well, it was due 3 little bugs
- Quaternions, my friends, are composed of 4 floats, and when I was reading frames I was just missing one component
- When I readed a frame and I send it to process, I only processed it when it had movable parts (that is, was different from the abse frame). But the base frame wasn’t processed so I had to process the base frame to get good results.
- The tutorial I was following said something like “I assume that parent index < current index so parents are always processed”. So did I, and when I was processing a frame I assumed that parents had been previously processed. Well that’s simply not true, so I had to do some adjustments to have a correct processing.
With all that fixing here and there I ended with this:
It was ok, just that it wasn’t moving due the first 2 models had an animation with 0 frames, nice isn’t? So i did a little more fixing-typing-hacking to cicle among all models’ actions to get this:
And finally I decided that watching a single model was nicer, so I loaded a single model and put a better camera:
So, at the end I got the model animated… but with no sound, and wouldn’t be nice if it had sound? Well, that’s the next thing to do! Stay tuned!