2014-01-29 89 views
1

我正在使用ThreeJs的空间3D射击游戏。除了碰撞,一切都进展顺利。我通过谷歌在网上找到了很多关于如何检测是否有碰撞的例子,但是我找不到任何解决我的具体问题的例子。Threejs和处理碰撞

基本上,如果你将你的船运行到一个星球上,那么这艘船就会停下来。然而,如果您旋转船舶然后向前行驶,撞上地球后,您将导致船舶“被吸入”行星!

在这里看我的演示:http://battaglia.homedns.org/webgl/space/ 控件:W,A,S,D分别旋转船舶,左,下,右,分别。 控件:向上,向下,向左,向右移动并转动。

这里是有碰撞检测的具体代码:

function CollisionDetected() 
{ 
    if (!shipSphere) 
    { 
     return false; 
    } 

    var moveDistance = 100 * delta; // 100 pixels per second 
    var originPoint = shipSphere.position.clone(); 

    if (shipSphere) 
    { 
     shipSphere.position.x = ship.position.x; 
     shipSphere.position.y = ship.position.y; 
     shipSphere.position.z = ship.position.z; 

     shipSphere.rotation.x = ship.rotation.x; 
     shipSphere.rotation.y = ship.rotation.y; 
     shipSphere.rotation.z = ship.rotation.z; 
    } 


    for (var vertexIndex = 0; vertexIndex < shipSphere.geometry.vertices.length; vertexIndex++) 
    { 
     var localVertex = shipSphere.geometry.vertices[vertexIndex].clone(); 
     var globalVertex = localVertex.applyMatrix4(shipSphere.matrix); 
     var directionVector = globalVertex.sub(shipSphere.position); 

     var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize()); 
     var collisionResults = ray.intersectObjects(collidableMeshList); 
     if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) 
     { 
      if (keyboard.pressed("up")) 
      { 
       ship.translateX(-moveDistance*2); 
      } 
      else if (keyboard.pressed("down")) 
      { 
       ship.translateX(moveDistance*2); 
      } 

     } 
    } 

} 
+0

你为什么跟踪球体的旋转?它是否用于跟踪船舶的实际旋转?问题可能是球体以某种方式错位,并且在碰撞后仍与相撞物体相交,并且当您旋转并尝试向前驱动时,它会注册'keyboard.pressed(“up”)',并让您进入星球而不是从它。 – ebbs

+0

球体的原因是因为有顶点数量的一小部分。如果我使用对象本身,它会减缓网站的爬行速度。另外,如果我使球体可见,则可以看到该位置与船舶对齐。 – vbguyny

回答

0

我假设,同时旋转你的船,一个或多个领域的顶点与网格相交。然后,在移动时,碰撞代码会触发,并以错误的方向发送对象。

尽量不要旋转碰撞球,而只是您的船。如果球体保持其方向,则在旋转船体时不应该意外地与任何物体相交。

我已经做了像这样的一个立方体作为碰撞对象,它对我来说工作得很好。