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);
}
}
}
}
你为什么跟踪球体的旋转?它是否用于跟踪船舶的实际旋转?问题可能是球体以某种方式错位,并且在碰撞后仍与相撞物体相交,并且当您旋转并尝试向前驱动时,它会注册'keyboard.pressed(“up”)',并让您进入星球而不是从它。 – ebbs
球体的原因是因为有顶点数量的一小部分。如果我使用对象本身,它会减缓网站的爬行速度。另外,如果我使球体可见,则可以看到该位置与船舶对齐。 – vbguyny