From yesterday, I have a walking avatar working in Three.js:
Today, I hope to add saunter to the walk. OK, maybe not saunter, but I would like to get the avatar a little more animated by getting the arms to move in rhythm with the legs.
Before worrying about frames of reference and the rotation of the arms, I try this the dumb way. That is, I add a name to the arm objects just as I did the leg objects yesterday:
var right_arm = limb(material);
right_arm.name = 'right_arm';
right_arm.position.x = 150;
right_arm.position.z = -50;
right_arm.rotation.z = -Math.PI/3;Using the name, I can make use of Three.js' getChildByName() to find the arms for later manipulation: avatar_left_arm = avatar.getChildByName("left_arm", true);
avatar_right_arm = avatar.getChildByName("right_arm", true);
avatar_left_leg = avatar.getChildByName("left_leg", true);
avatar_right_leg = avatar.getChildByName("right_leg", true);Lastly, in the render() function that animates my avatar, I add the same exact x-axis rotation to the arms that I did the legs: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_arm.rotation.x = amplitude*(Math.PI/8);
avatar_right_arm.rotation.x = -1*amplitude*(Math.PI/8);
avatar_left_leg.rotation.x = amplitude*(Math.PI/8);
avatar_right_leg.rotation.x = -1*amplitude*(Math.PI/8);
renderer.render(scene, camera);
}After reloading the page... it actually seems to work:I am not quite convinced that this is doing what I expect—it may just be a trick of perspective. To find out for certain, I am going to rotate the camera around. I could just hard-code the camera to a different position, refresh the page and look. I think it a better use of my time to figure out how to animate that.
At first I think about doing this manually myself, but stumble across FirstPersonControls. There is no actual documentation, but the code is quite readable. It seems that I need to supply a
Camera object, which I have in the standard Three.js init() function:function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 1000;
scene.add(camera);
controls = new THREE.FirstPersonControls(camera);
// ...
}
Then, in the usual Three.js render() function, I update the controls:function render() {
// ...
controls.update(clock.getDelta());
}(I added the clock yesterday)With that, I get a completely blank page. After some experimentation, I find that, if I start right on top of the avatar and I tune the controls:
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
// camera.position.z = 1000;
scene.add(camera);
controls = new THREE.FirstPersonControls(camera);
controls.movementSpeed = 1000;
controls.lookSpeed = 0.125;
controls.lookVertical = true;Then I can eventually navigate back to see that my orientation is wrong. I am now underneath my avatar looking up:It probably should not surprise me, but the
FirstPersonControls start moving forward and I have to stop the motion in order to reverse and re-orient so that I can see things.It turns out that I want the
FlyControls, no the first person controls. I am still unclear why the first person controls seemingly ignored my z-axis orientation, but when I uncomment that setting and enable some reasonable FlyControls settings:function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 10000);
camera.position.z = 1000;
scene.add(camera);
controls = new THREE.FlyControls(camera);
controls.movementSpeed = 1000;
controls.rollSpeed = 1.0;
// ...
}Then I can again see the avatar when I start. More importantly, I can use the controls to see that I have a seriously messed up avatar when viewed from anywhere other than straight on:The controls are nice, but the mouse movement on my trackpad causes wild gyration of the camera. To disable, I find the
dragToLook property in the source. Setting it to true seems to disable it: controls = new THREE.FlyControls(camera);
controls.movementSpeed = 1000;
controls.rollSpeed = 1.0;
controls.dragToLook = true;
With that setting, I would expect that I could click and drag the page to repeat the wild gyrations, but this has no effect. I am not going to worry (for now) about that since I have no use for the behavior. Satisfied that I have decent camera control, I call it a night. I am going to revisit the way that I build the avatar tomorrow and hopefully ensure that the arm motion is also satisfactory.
Day #452



This comment has been removed by the author.
ReplyDelete