If you're here to find out more about me, be sure to check out my Personal Web Page for more details including my resume, demos, and code samples.
I apologize for all of the dark periods I've had on this project since I released it. I try to work on the project in my spare time, but I've been busy finishing school and I'm guilty of playing a few games now and then instead of coding. The good news is I'm really close to making the next major release, and everything is pretty much done; I'm just making sure the documentation is complete and doing some last minute polishing. At first I was planning on making the release before GDC in the hopes that one of the companies I talked to at GDC would recognize it, but I decided to delay the release in favor of making the release smoother and more polished. I have put a lot of work into this version and I don't want to cut any corners at the end. Here are some of the changes in the next release:
What's New in Version 3.0
I've been doing a lot of work on Animadead in the last month, despite my lack of updates on the page. I'll do my best to summarize everything that's happened.
DocumentationOne thing you can check out right now is the documentation. I used Doxygen and Graphvis to make reference documentation and some nice collaboration diagrams. I went through all of the classes and members and added very thorough details and I'm working on the guide now. The documentation was generated from my local copy of Animadead, which has quite a few little changes and improvements since the last release.
ShadersI wrote a shader in CG for OpenGL, which didn't work well on my system, I think due to the best OpenGL CG profile my card supported doesn't utilize the full potential of my card, and I had trouble with passing the list of bone matrices to the card. The compiler for the supported profile had a ridiculously low number of uniform parameters I could send. So for my simple boxman demo, which has 41 bones or so, I couldn't get it to work, and I didn't feel like making a model with fewer bones.
So after running into a bit of trouble with CG, I wrote a shader in GLSL, which at first had problems as well, but it turns out all I needed to do was upgrade my graphics drivers. Once I did that I got the shader to work, and it's nice and fast.
I plan to have both shaders working well and will provide them with the next release.
Library UpdatesAside from shaders and demos, I have done some work on the library itself. I redesigned the mesh swapping system, and I am pretty happy with the new design. You can get an idea how it works from the reference docs of ad::Model, the main interface to the library. The relevant functions are: GenSlot(), LoadMesh(), BindMesh(), UnbindMesh() - overloaded. I'll have more details on how to use this in the guide I'm in the middle of writing.
The Next ReleaseI intend to make another release pretty soon with the following new features:
Changes to the webpageOn the about page I've included a description of the versioning I'm using. I added the features page to the menu, instead of referring to it from the about page and on the features page, I've added a section that contains the goals for the library up to the next major version (goal version), and future plans beyond that. I've also added a digested version of the license.
School is out and now I can't use it as an excuse for not working on Animadead. I've done some work since the last time I made a release, which can be seen in the CVS version. The changes include updating the source documentation on a functional level, reorganizing the matrixmath, quaternion, and vector3. Also, I've been trying to update the code to be built as a dynamic-link library instead of a static-link library to make it more compatible with the LGPL license as a stand-alone library.
Up to the current version (2.0.1) there was an issue I overlooked in organizing the data in memory making it not ideal for use in a vertex array, despite this being it's intended use. The issue is that information such as the number of sides per polygon and the number of bone influences per vertex are dynamic and not fixed (like for a primitive type, GL_TRIANGLES). To use a vertex array, the data should all be fixed size, and then I can use an offset and set vertex pointers to the mesh structures. This is one of the changes I will be working on this weekend.
Other top items on my to-do list include: making an export plug-in for 3D Studio Max, making an example program using vertex shaders, and skinning, rigging, and animating my ogre model for example programs.
Animadead provides game developers with an easy to use interface for implementing skeletal animations in a game. Release 2.0 is significantly restructured and has many new powerful features.
The most major change for Animadead was the way orientations and locations of bones are stored internally. Animadead 2.0 now uses quaternions internally to store local transformations instead of using matrices for world transformations. Details about the transformations used can be found here.
Animadead 2.0 now uses skeletal hierarchies since bones now use local transformations. Skeletal hierarchies keeps bones connected they way they should be and prevent the skeleton from coming apart, or "dislocating", during animation. This is especially useful in rag-doll physics.
Blends are new this release and are used to calculate a pose, usually from two other poses. One type of blend is an animation player, which is used to keep track of the current time in the animation and can generate a skeletal pose at that time (between two frames). Another type of blend is a blend between blends. When this blend is calculated, it first calculates the two blends it's blending, and then blends those together with a user-defined weight. Since this is a recursive definition, blends can in fact be setup in a hierarchy, and the user only needs to call the top level calculate function.
Another new feature to Animadead 2.0 is bone selection masks, which are a selection of a subset of the entire skeleton. The hierarchy is used to make the selection process simpler. Essentially, all bones are the same selection state as their parent, unless set directly. Details on how this works can be found here.
In addition to being able to calculate a pose from a complex system of blends, the calculate function can be given an optional bone selection mask, which limits the calculations done for that blend to only the subset of bones defined by the selection. This allows you to calculate different parts of a skeleton with different animations.
Another significant change was the method in which models are drawn. Now, no mesh data is manipulated in the library. Instead of providing a calculated mesh to draw, a final set of calculated world matrices are generated which can be easily used as parameters to a vertex-shader, or used to manipulate the mesh directly.
The exporter for Maya has been updated and now builds a File-Translator plug-in, which uses Maya's built-in "File | Export" feature.
The file formats have been changed to accommodate the new internal structures used, and for now use text mode for readability and debugging purposes.
A full list of detailed features can be found here.
This release of Animadead includes Configure and Makefile scripts for Linux/Unix like operating systems, and Dev C++ and Visual Studio .NET 2003 project files for Windows operating systems and can be downloaded here.
The second release, which adds configure and Makefile scripts to make it feasible for anyone to compile and check out the library. And a converter was added for converting the filetypes to the proper endianess.
If you haven't checked it out, or haven't been able to, hopefully now you will. I've also posted a windows executable so if you have windows and just want to see what it does you can start there.
I've been busy trying to add portable Configure and Makefiles to Animadead for those of you who have not been able to use the existing project files. I will also be adding some more documentation and tutorials this weekend. I'll be making tutorials on using and creating animations for the library and working with Maya and I'll provide examples using duke. I will also in the not-to-distant-future be creating reference documentation to all of the commands in the library.
I have this next week off and I'll have a lot of time to give to the project and the users if any of you have questions. I'll probably start the web page for this library soon too. While I'm on the topic, I'll mention, I'd like to have a logo for the web page where there is a grave and a skeleton crawling up out of the grave, becoming animated. And help illustrate the pun of animating the dead (ie. skeletons) hence Animadead, which is pronounced animated.
Animadead is a skeletal animation library designed to load and play skeletal animations. It supports models that are composed of several swappable meshes bound to a single skeleton that can be driven by multiple animations. Animadead uses existing modeling programs to export animations to it's own file types and provides a library to load them using C++.
Animadead was written in C++ and has no dependencies. However, an example implementation is provided that uses OpenGL and SDL. The example provides a model set up with several meshes: feet, hands, head, hair, torso and pants. And has a second torso mesh to illustrate swapping meshes. The original model is provided.
There is an export plug-in for Maya provided, and others are in development, including a plug-in for 3D Studio Max and Lightwave. You can download the source here: http://prdownloads.sourceforge.net/animadead/animadead-0.7.zip?download
The motivation for this library is due to the fact that there is no well-known format for skeletal animation in games. Animadead is my attempt to present a format, which can evolve into that well-known format and even provide the basic functionality of loading and playing animations.
© Copyright 2006 John Butterfield.
All Rights Reserved.