3

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

如何做到这一点?

4

2 回答 2

6

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

例如

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

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

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

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

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

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

例如

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

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

您可以在本书中查看其他更高级的 3D 碰撞检测算法,但最好让事情尽可能简单/快速。

于 2012-07-10T18:55:10.637 回答
2

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

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

于 2012-07-11T13:04:08.463 回答