2014-11-23 1419 views
2

我正在制作一个简单的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)。非常感谢您的帮助!

回答

0

也许这是BoundingSphere,但如果Object改变大小(没有缩放),这只会是一个问题。

Object.Model.geometry.computeBoundingSphere();

BoundingSphere

但我不认为这是你的问题的解决方案。你可以上传一个jsfiddle吗?

+0

谢谢,但这不是问题。我的对象永远不会改变大小,我也尝试过使用computeBoundingSphere()无济于事。我最终实现了我自己的(原油)碰撞检测系统,该系统对我的目的来说工作得很好。 – TeaCup 2015-01-08 01:05:50