Wednesday, July 25, 2012

Simple Three.js Bounds, If Not Collisions

‹prev | My Chain | next›

I am nearly done with my Three.js avatar. I have an island for it to walk around. I have the arms and legs animated as it walks. The avatar even spins in the right direction when walking. The only problem left is that I can walk on water:


It is easy enough to bound the avatar. In the render() method, I check the X and Z position of the avatar, stopping motion if necessary:
function render() {
  // ...
  if (controls.object.position.z >  2800) controls.moveLeft = false;
  if (controls.object.position.z < -2800) controls.moveRight = false;
  if (controls.object.position.x >  2800) controls.moveBackward = false;
  if (controls.object.position.x < -2800) controls.moveForward = false;

  // ...
  renderer.render(scene, camera);

  controls.update(clock.getDelta());
}
The FirstPersonControls are tied to the avatar. So I can access the avatar as controls.object. Then it is a simple matter of disabling the controls before the call to controls.update().

With that, I am prevented from leaving the island:


That is probably sufficient for my needs, but I would like to get collision detection working. My understanding is that rays are needed for collision detected. So I add a wall whose collision that I would like to detect and implement a collision detection function in render():
function detectCollision() {
  var vector = controls.target.clone().subSelf( controls.object.position ).normalize();
  var ray = new THREE.Ray(controls.position, vector);
  var intersects = ray.intersectObjects(walls);

  if (intersects.length > 0) console.log(intersects);
}
Unfortunately, that never works. Even if I place the wall at the origin where the avatar starts, the ray and the walls never intersect.

I am unclear why Rays are needed for collision detection. Position alone ought to be sufficient to determine if two objects overlap. This leads me to believe that I may very well be doing something wrong. But what I am doing wrong eludes me for tonight. I will pick back up with this tomorrow. If I cannot solve it by then, it is probably time to venture back to Gladius land.


Day #458

1 comment:

  1. The AZ-500 questions answers is Microsoft's certification exam designed for professionals aiming to demonstrate their expertise in Microsoft Azure security technologies and implementing security controls, maintaining security posture, managing identity and access, and protecting data, applications, and networks.

    ReplyDelete