如果我知道每个对象的边界Sphere,如何找到对象是否相交

时间:2018-03-24 16:58:30

标签: javascript math three.js

我需要找到对象(KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); )是否相交。我知道每个对象的边界球体半径和中心坐标(kpg.initialize(1024); KeyPair kp = kpg.generateKeyPair(); )。

4 个答案:

答案 0 :(得分:1)

遍历每个object1和每个object2。使用毕达哥拉斯定理两次来计算object1和object2之间的(3d)距离,然后检查距离是否大于它们的半径。

答案 1 :(得分:0)

如果您只想测试边界球,那么CertainPerformance的答案是正确的。给定P1 =(x1,y1,z1)和P2 =(x2,y2,z2),P1和P2之间的距离由d(P1,P2)=(x2-x1)^ 2 +(y2-y1)给出^ 2 +(z2-z1)^ 2

如果你想检查一个凸包,它仍然可以很容易地完成,但如果你的对象是凹的,你必须看看“三角汤”来检查碰撞,它真的很慢(想想秒而不是几毫秒)。另一种方法是将凹模型分解为多个凸模型并进行凸壳碰撞测试。 (见这里:https://github.com/kmammou/v-hacd

这是一般的碰撞检测的另一个很好的参考:https://www.toptal.com/game/video-game-physics-part-ii-collision-detection-for-solid-objects

答案 2 :(得分:0)

给定一个具有位置(x,y,z)和半径(r)的球体数组,其简单如下:

 function getSphereIntersect(array){
  for(const [i, spere1] of array.entries()) {
    for(const sphere2 of array.slice(i + 1)){
      const distance = Math.sqrt(
        (sphere1.x - sphere2.x) ** 2 +
        (sphere1.y - shere2.y) ** 2 +
        (sphere1.z - sphere2.z) ** 2
     );
    if(distance < sphere1.r + sphere2.r)
     return [sphere1, sphere2];
  }
 }
}

或者如果sphere1得到一个实现Vector的位置,那么检查交叉点会更多:

  sphere1.pos.sub(shpere2.pos).len() < sphere1.r + sphere2.r

答案 3 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="deck" id="card-deck"> </div>.boundingSphere的对象。

如果您仔细阅读文档,那么您将发现该对象具有.intersectsSphere()方法,该方法返回一个布尔值。 因此,当您添加新对象时,请计算其边界球并检查它是否与任何先前对象的边界球相交。