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

How to detect collisions between a cube and sphere in three.js?

本文关键字:之间 碰撞 立方体 检测 three js      更新时间:2023-09-26

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

如何做到这一点?

最简单的选项是使用Vector3的distance to()或distance ToSquared函数,使用两个对象之间的欧氏距离。

例如

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

如果两个对象之间的距离大于球体的半径和立方体的边之间的总和,那么这将是潜在的碰撞。我还建议使用distance ToSquared,因为它更快(因为它不调用sqrt),而且检查碰撞仍然很有用。

注意这个方法不是非常精确的-它本质上是检查两个球体之间的碰撞(将立方体估计为半径等于立方体边一半的球体),但我希望它足够接近/适合您的设置,因为在我看来,它是最容易、最快实现的。

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

脑海中浮现的另一种方法是找到球体上最靠近立方体的点:

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

例如

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

如果这是我的想法,所以我不能保证上面的片段会起作用,那么可能值得先在pointOnSphere的坐标上放置一个粒子进行检查。

你可以在这本书中查看其他更先进的3D碰撞检测算法,但最好尽可能简单/快速。

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

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