Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在three.js中检测立方体和球体之间的碰撞?_Javascript_Collision Detection_Three.js - Fatal编程技术网

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

Javascript 如何在three.js中检测立方体和球体之间的碰撞?,javascript,collision-detection,three.js,Javascript,Collision Detection,Three.js,我的场景中有两个简单的3D对象(一个球体和一个立方体),我想检测它们是否发生碰撞 如何实现这一点?最简单的选择是使用两个对象之间的欧几里德距离,使用Vector3或distanceToSquared函数 e、 g 如果两个对象之间的距离大于球体半径和立方体侧面之间的总和,则可能发生碰撞。我还建议使用distanceToSquared,因为它更快(因为它不调用sqrt),而且检查碰撞仍然很有用 注意这种方法不是超精确的-它本质上是检查两个球体之间的碰撞(将立方体估计为半径等于立方体边一半的球体),

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


如何实现这一点?

最简单的选择是使用两个对象之间的欧几里德距离,使用Vector3或distanceToSquared函数

e、 g

如果两个对象之间的距离大于球体半径和立方体侧面之间的总和,则可能发生碰撞。我还建议使用distanceToSquared,因为它更快(因为它不调用sqrt),而且检查碰撞仍然很有用

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

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

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

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

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


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

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


我认为你需要使用插件库。比如:。

谢谢,但是计算距离只适用于像这些简单的对象。那么three.js中有内置碰撞检测器吗?内置?我不知道。如果你看僵尸,Scows使用欧几里德距离(虽然是用sqrt手工实现的,并且是cow和当前僵尸位置向量之间的差异)。对于更复杂的东西,你可以自己滚动或尝试类似的东西-看看支持的形状。我还没有时间玩这个,但可能可以帮助其他形状。
console.log(yourCube.position.distanceToSquared(yourSphere.position));
var pointOnSphere = yourSphere.position.clone().sub(yourCube.position).normalize(). multiplyScalar(yourSphereRadius);