我的场景中有2个简单的3D对象(球体和立方体),我想检测它们是否发生碰撞。
如何实现这一目标?
答案 0 :(得分:6)
最简单的选择是使用Vector3的distanceTo()或distanceToSquared函数来使用两个对象之间的欧氏距离。
e.g。
console.log(yourCube.position.distanceToSquared(yourSphere.position));
如果两个物体之间的距离大于球体半径和立方体侧面之间的距离,那么这将是潜在的碰撞。我也建议使用distanceToSquared,因为它更快(因为它没有调用sqrt),并且检查碰撞仍然很有用。
注意这个方法并不是非常精确 - 它主要是检查两个球体之间的碰撞(将立方体估计为半径等于立方体一半的球体),但我希望它是关闭/足够好你的设置,因为它是我认为最容易和最快的实施。
您可能会注意到,在一定距离之前,立方体的角将发生碰撞而不会触发碰撞。您可以通过传递不同的立方体比率来调整“阈值”。想象一下你的立方体周围的一个球体,这个球体的比例应该有多大,以便为你的设置获得一个不错的估计碰撞。
另一种想到的方法是找到最靠近立方体的球体上的点:
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/。