Thursday, March 14, 2013

Walk cycle loop speed tied to layer position

This is an experiment, not super polished but it seems to work. A looped walk cycle's speed is controlled by the a layer's position so that the legs move at the right speed to more or less match the speed of the character's movement (in my bad example above the feet slide a bit but you get the general idea)

I bodged it from a couple of expressions (including the 'Wheel' from in the superb Duik IK and animation script tools,) so it includes some 360° rotation stuff even tho nothing is rotating! :-S I think this might be somewhat redundant but it works and I can't think how to optimise it right now.

The "stridelength" is the length, in pixels, of the walk cycle's stride; you have to just manually measure it somehow until i think of a cleverer way. ?!

walkcyclepos = thisLayer.toWorld(thisLayer.anchorPoint); // the position of the walk cycle layer
stridelength = 110; // the length in pixels of the walkcycle's stride
wheel = -(value + radiansToDegrees(walkcyclepos[0]/stridelength))%360*-1; // i took most of this from an expression to tie rotation to position, and then connected the rotation to time remap. :-S
if (wheel < 0) wheel += 359;

A smoother and higher frame rate walkcycle would be better for testing this but I just downloaded some random Muybridge gif.

I guess the higher the frame rate of the walk cycle, the less sliding there would be. At low speeds there'd always be some of course. When i actually try and do something with this I'll probably somehow posterize the time of the position animation and maybe the timeremapping too? that might help. or make it worse. Anyway this is going to be most useful for deliberately rough collagey animation so probably doesn't matter too much :)