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

Dan*_*Fox 3 javascript collision-detection three.js

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

怎么能实现这一目标?

Geo*_*nza 6

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

例如

console.log(yourCube.position.distanceToSquared(yourSphere.position));
Run Code Online (Sandbox Code Playgroud)

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

请注意,这种方法并不是非常精确 - 它实际上是检查两个球体之间的碰撞(将立方体估计为半径等于立方体一半的球体),但是我希望它对于你的设置来说非常接近/足够好,因为它是在我看来,最简单,最快速的实施.

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

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

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

例如

var pointOnSphere = yourSphere.position.clone().sub(yourCube.position).normalize(). multiplyScalar(yourSphereRadius);
Run Code Online (Sandbox Code Playgroud)

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

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