我正在制作一个简单的three.js游戏,其中用户控制一个名为playerModel的宇宙飞船(一个带有简单BoxGeometry的Mesh对象),并且必须避免在-Z方向上产生很远的小行星(SphereGeometry),并且朝着船向+ Z方向移动。Raycaster Three.js碰撞检测:IntersectObjects方法返回没有意义的交点距离
这是我detectCollisions功能:
// Returns true if playerModel is intersecting with
// any of obstacles, false otherwise.
function detectCollisions(obstacles) {
var origin = playerModel.position.clone();
for (var v = 0; v < playerModel.geometry.vertices.length; v++) {
var localVertex = playerModel.geometry.vertices[v].clone();
var globalVertex = localVertex.applyMatrix4(playerModel.matrix);
var directionVector = globalVertex.sub(playerModel.position);
var ray = new THREE.Raycaster(origin, directionVector.clone().normalize());
var intersections = ray.intersectObjects(obstacles);
if (intersections.length > 0 &&
intersections[0].distance < directionVector.length()) {
console.log("Fatal collision!"); // definitely a collision
return true;
}
}
return false;
}
我呼吁在游戏圈这种方法如下,其中“球”是小行星的数组:
function draw() {
// loop draw function call
requestAnimationFrame(draw);
// draw THREE.JS scene
renderer.render(scene, camera);
if (!isGameOver) {
generateSpheres();
handleKey(); // updates player direction
movePlayer(); // moves player in direction
moveSpheres();
if (detectCollisions(spheres))
gameOver();
}
}
这是“工作”在这种情况下,它会检测交叉点并调用gameOver函数,但它正在检测碰撞,这在视觉上甚至不会接近碰撞。 ray.intersectObjects方法似乎返回的距离被计算为非常接近(类似于10)的交点,即使小行星对象据推测与其相交的位置非常远(位置如下所示:x:-872 y :-331 z:-5940)来自位于(0,0,50)处的playerModel。
它也似乎是造成致命碰撞的相交小行星物体始终有faceIndex 37,不知道为什么。小行星是由环和段== 7和不同的半径在20到150之间创建的。玩家模型相当小(w:15,h:15,d:30)。非常感谢您的帮助!
谢谢,但这不是问题。我的对象永远不会改变大小,我也尝试过使用computeBoundingSphere()无济于事。我最终实现了我自己的(原油)碰撞检测系统,该系统对我的目的来说工作得很好。 – TeaCup 2015-01-08 01:05:50