Today is mostly filled with fun as OSCON, but the gods of my chain must be appeased. So I pick back up with the Three.js avatar that I created yesterday:
Today, I would to add simple animation. To keep things short, I am only going to animate the legs. I will worry about the arms tomorrow as the additional rotation should complicate things slightly.
I start by adding two more global variables at the top of my
avatar.js script:var camera, scene, renderer, clock,
avatar, avatar_left_leg, avatar_right_leg;In Gladius / CubicVR.js, I have been naming those objects and assigning them to variables on demand. It turns out to be possible to do the same in Three.js: var left_leg = limb(material);
left_leg.name = 'left_leg';
left_leg.rotation.z = Math.PI;
left_leg.position.y = -250;
left_leg.position.x = -100;
left_leg.position.z = -50;
avatar.add(left_leg);The limb() is the simple generator from yesterday that produces a grouped set of 3D objects; in this case it produces a leg and foot. After setting the name and doing the same for the right leg, I can assign the global variables after the avatar is assembled:function init() {
scene = new THREE.Scene();
// ...
avatar = buildAvatar();
scene.add(avatar);
avatar_left_leg = avatar.getChildByName("left_leg", true);
avatar_right_leg = avatar.getChildByName("right_leg", true);
// ...
}The true second argument to getChildByName() instructs the method to look at the top-level avatar object and all children and grandchildren objects.I will use the algorithm from the gladius avatar to animate this one as well. First off, I need a clock object. I build that in the initialization code:
document.addEventListener( "DOMContentLoaded", function( e ) {
init();
clock = new THREE.Clock(true);
animate();
});The true argument in this case starts the clock immediately rather than waiting for a manual call to start().With that, I am ready to apply the walking algorithm to the two legs. This is done in the
render() method, which is invoked on each subsequent frame:var w = 500;
function render() {
var t_float = clock.getElapsedTime()
, t = t_float * 1000
, amplitude = (w/2 - Math.abs((t % (2*w)) - w))/w;
avatar_left_leg.rotation.x = amplitude*(Math.PI/8);
avatar_right_leg.rotation.x = -1*amplitude*(Math.PI/8);
renderer.render(scene, camera);
}The only difference between this animation and the one that I did for Gladius is that the Clock object in Three.js produces a float of seconds when getElapsedTime() is invoked instead of an integer of the number of milliseconds. So, after simply multiplying by 1000, I have the number of milliseconds and... everything works.I can watch as my avatar steps forward with its right foot:
And then the left:
That will do for a stopping point today. Tomorrow I will get the arms swinging in unison and possibly add some camera panning.
Day #451


Japh(R) By Chris Strom: Animating Three.Js Legs >>>>> Download Now
ReplyDelete>>>>> Download Full
Japh(R) By Chris Strom: Animating Three.Js Legs >>>>> Download LINK
>>>>> Download Now
Japh(R) By Chris Strom: Animating Three.Js Legs >>>>> Download Full
>>>>> Download LINK x7