I was not quite able to get collision detection working in Three.js last night. I don't really need it for my immediate need, which is keeping my avatar on its tropical island:
I can already achieve the necessary boundary limits with simple position checks. Instead, I would like to use collision detection to do this. So I create a wall:
var wallGeometry = new THREE.CubeGeometry(100, 1000, 5000, 5, 5, 5)
, wallMaterial = new THREE.MeshBasicMaterial({color: 0xFFD700})
, wallMesh = new THREE.Mesh(wallGeometry, wallMaterial);
// wallMesh.position.x = -M*0.6;
scene.add(wallMesh);And try to detect a collision with this wall on every render():function render() {
// ...
detectCollision();
// ...
}Collision detection is a three step process in Three.js. First, I need to know where I am and in which direction I am facing. That is, I need a Ray. Second I need to know if that Ray crosses another object (the wall in this case). Lastly, I need to know the distance from the object. Last night, with the help of a Three.js "bug report", I cobbled together a collision detection algorithm of: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);
}This failed to work, even when the player was standing in the middle of the wall:After debugging this some, I realize that my problem is that my
Ray has a null position. Earlier in the function, I got the position of my avatar from controls.object.position. For the Ray, I am just trying controls.position, which is undefined. Such is the price of copying code without really understanding it.In the end, I also have to add a distance check:
function detectCollision() {
var vector = controls.target.clone().subSelf( controls.object.position ).normalize();
var ray = new THREE.Ray(controls.object.position, vector);
var intersects = ray.intersectObjects(walls);
if (intersects.length > 0) {
if (intersects[0].distance < 5) {
console.log(intersects);
}
}
}
But, with that, I have my wall collision detection working. I call it a night here. Up tomorrow, I will rework this into a useful island boundary, which should conclude my Three.js work.Day #459


No comments:
Post a Comment