如何在three.js中检测立方体和球体之间的碰撞?

时间:2012-07-10 17:34:07

标签: javascript collision-detection three.js

我的场景中有2个简单的3D对象(球体和立方体),我想检测它们是否发生碰撞。

如何实现这一目标?

2 个答案:

答案 0 :(得分:6)

最简单的选择是使用Vector3的distanceTo()或distanceToSquared函数来使用两个对象之间的欧氏距离。

e.g。

console.log(yourCube.position.distanceToSquared(yourSphere.position));

如果两个物体之间的距离大于球体半径和立方体侧面之间的距离,那么这将是潜在的碰撞。我也建议使用distanceToSquared,因为它更快(因为它没有调用sqrt),并且检查碰撞仍然很有用。

注意这个方法并不是非常精确 - 它主要是检查两个球体之间的碰撞(将立方体估计为半径等于立方体一半的球体),但我希望它是关闭/足够好你的设置,因为它是我认为最容易和最快的实施。

您可能会注意到,在一定距离之前,立方体的角将发生碰撞而不会触发碰撞。您可以通过传递不同的立方体比率来调整“阈值”。想象一下你的立方体周围的一个球体,这个球体的比例应该有多大,以便为你的设置获得一个不错的估计碰撞。

另一种想到的方法是找到最靠近立方体的球体上的点:

  • 你知道可以通过减去两个位置向量来获得从球体中心到立方体中心的点
  • 您可以通过对上面的差异向量进行归一化并按球半径缩放来获得立方体方向上的球体上的点
  • 然后你可以检查那个点是否在立方体内(通过检查坐标是否在立方体的轴对齐边界框内(AABB)

e.g。

var pointOnSphere = yourSphere.position.clone().sub(yourCube.position).normalize(). multiplyScalar(yourSphereRadius);

这个如果偏离我的头顶,所以我无法保证上面的代码片段能够正常工作,可能值得将一个粒子放在pointOnSphere的坐标上进行检查。

还有其他更先进的3D碰撞检测算法,您可以在this book中查看,但最好尽量保持简单/快速。

答案 1 :(得分:2)

不幸的是,three.js没有任何碰撞检测器:Collision detection?

我认为你需要使用插件库。像这样:http://yomotsu.github.com/threejs-examples/cannonjs_box/