我的场景中有 2 个简单的 3D 对象(一个球体和一个立方体),我想检测它们是否发生碰撞。
如何做到这一点?
最简单的选择是使用两个对象之间的欧式距离,使用 Vector3 的distanceTo()或 distanceToSquared 函数。
例如
console.log(yourCube.position.distanceToSquared(yourSphere.position));
如果两个物体之间的距离大于球体半径和立方体边的总和,那么这将是潜在的碰撞。我还建议使用 distanceToSquared,因为它更快(因为它不调用 sqrt)并且检查碰撞仍然很有用。
请注意,这种方法不是非常精确 - 它本质上是检查两个球体之间的碰撞(将立方体估计为半径等于立方体边一半的球体),但我希望它对于您的设置来说足够接近/足够好,因为它是在我看来,最容易和最快的实现。
您可能会注意到立方体的角会发生碰撞,直到一定距离才会触发碰撞。您可以通过传递不同的立方体边比来调整“阈值”。想象一下您的立方体周围有一个球体,该球体的比例应该有多大才能为您的设置获得合适的估计碰撞。
想到的另一种方法是在球体上找到最接近立方体的点:
例如
var pointOnSphere = yourSphere.position.clone().sub(yourCube.position).normalize(). multiplyScalar(yourSphereRadius);
如果这不是我的想法,所以我不能保证上面的代码片段会起作用,可能值得先在 pointOnSphere 的坐标处放置一个粒子进行检查。
您可以在本书中查看其他更高级的 3D 碰撞检测算法,但最好让事情尽可能简单/快速。
不幸的是,three.js 没有任何碰撞检测器:碰撞检测?.
我认为您需要使用插件库。像这样:http: //yomotsu.github.com/threejs-examples/cannonjs_box/。