For about 15 years now I've wanted to do something with stick
figures. I never knew what. I just wanted to try animating them. The
games I like tend to be isometric or top-down views; I generally don't
like first person or side views. As a result, stick figure animation
just never seemed useful enough to put into one of my games.
While reading Scott McCloud's books about comics a few years ago, I
had an idea blending comic books and games, and it just happens to be
a good fit for stick figure animation. I'm not sure I want to pursue
it, but since I had spent so much time on the spaceship physics and
editor, I thought it'd be a good break for me to take a break and take
a look at stick figure animation. If it turns out to be fun I might
explore the comic book idea a bit more.
The other thing that I've been wanting to explore is the ninja
side of the pirates vs. ninjas theme. Sure, we have href="http://askaninja.com/">Ask a Ninja, but overall I think the
pirates have gotten far too much attention. There are several
pirate-themed games, like Sid Meier's Pirates, Puzzle Pirates, and
Tropico 2 Pirate Cove, but not so many for ninjas. href="http://www.talklikeapirate.com/">Talk Like a Pirate Day gets
plenty of attention but the equivalent for ninjas just doesn't
compare. Only the Somali pirate attacks are hurting the pirate
image. So if I write a stick figure animation game, the protagonist
will be a ninja fighting the evil pirates.
How am I going to make my 2D ninja stick figure move? There are
are lots of approaches to character animation: forward kinematics,
inverse kinematics, physical simulation, “ragdoll” physics, motion
capture, etc. My goal was to make something simple and reasonable
without putting in much artwork (motion capture or hand-drawn
animation). My hope was that a 2D stick figure would take much less
effort than the full 3D motion systems.
I wanted to try the simplest approach first, using basic geometry
to move the legs. The hip and knee angles tell me where the ankle will
end up. If I know where I want the ankle to be, I should be able to
find the hip and knee angles. I tried approaching it as a gradient
function, using hill-climbing to reach the solution, but it turns out
this is overkill if you only have two angles. The femur and tibia
length are known, and I know the distance between the hip and my
desired ankle position. That means we know the three sides of the
triangle, and can use the href="http://en.wikipedia.org/wiki/Law_of_cosines">law of cosines
to determine the angles. Simple. Ankles and wrists work out pretty
nicely.
The next step was to make the figure take a step (pun intended,
sorry!). I looked at some animator pages about the href="http://www.idleworm.com/how/anm/02w/walk1.shtml">walk cycle
I also read lots of papers
about walking mechanics, including some about automatically
“learning” how to walk. Along the way I discovered something cool: href="http://www-personal.umich.edu/~shc/pdw.html">passive walking
dynamics (see animation href="http://www-personal.umich.edu/~artkuo/Passive_Walk/passive_walking.html">here),
which treats walking as an inverted pendulum (your body over the
supporting leg) and a normal pendulum (your free leg swinging
freely). It seems to be a pretty good approximation of how people
walk.
I decided the simplest thing would be to make the target ankle
position follow a circle, as if you were on a bicycle, and then have
the ground prevent your foot from going down. This actually looked
reasonable, but the “liftoff” and “landing” of the foot didn't look
right. To make them look better, I added transitions (see href="http://www.awn.com/qas/60.html">this page) that used the toe
as a pivot point (for liftoff) and the heel as a pivot point (for
landing). This definitely looked better, but the liftoff and landing
have the ankle moving in circular arcs, and these don't smoothly
transition into the overall circular motion. I improved it a bit more
by making the ankle follow a spline that matched the arcs.
I was pretty happy with the walking animation, but several friends
reminded me that in a ninja game, you're not going to spend much time
seeing the ninja walk. The ninja will run, sneak, jump,
kick, punch, throw stars, duck, swing, hide, and do flips, but
walking? How boring. So once again I realized that I had been focusing
on the wrong problem. The second thing was that my test app had a
giant ninja, but in the game it'd look tiny, so all the little details
like the flexing foot, the bounce in his step, or the liftoff and
landing (which would be only a pixel high) really don't matter. [Edit 2008-05-13: changed “pirate” to “ninja”; thanks Anonymous for pointing out my error.]

I'm not sure where I want to go with this. The walking research
papers were cool, but I didn't find research papers about
gravity-defying ninja backflips. My gut tells me that the ninja
doesn't obey the laws of physics, and thus I should stick to the
geometrical approach instead of using a physics engine. href="http://box2dflash.sourceforge.net/">Box2D looks pretty neat,
and I'm sure I can use physics for other things in the game. But I
need to first figure out how I'm going to implement ninja moves. Do I
want to procedurally generate them somehow, or do I want to hand-pick
the key frames? It'd be cool to generate them in a way that
could take into account everything in the scene. For example, a jump
kick should be able to jump on the box before jumping for the
kick. But I suspect that's a lot more work than I want to tackle right
now, and unless it's a key part of the game (if I end up writing a
game), it's just not that important.
That brings up the question: what is the goal here? Am I doing
this to satisfy my long-time dream of animating stick figures, or
should I try to write a little game that can show off the comic book
idea, or do I really want to write a game?
I don't know yet. So that leaves me at: I still want to do something with animated stick figures, and I still don't know what. But if I ever figure it out, I have now learned some things that might come in handy.
Không có nhận xét nào:
Đăng nhận xét