我需要找到对象(KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
)是否相交。我知道每个对象的边界球体半径和中心坐标(kpg.initialize(1024);
KeyPair kp = kpg.generateKeyPair();
)。
答案 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()
方法,该方法返回一个布尔值。
因此,当您添加新对象时,请计算其边界球并检查它是否与任何先前对象的边界球相交。