2011-02-25 14 views
2

ボックスが球に衝突しているかどうかを確認する必要があります。私はx、y、z、幅、高さ、深さで定義されたBoundingBoxクラスを持っています。 x、y、z、radiusで定義されたBoundingSphereクラスもあります。交差するかどうかを確認する方法は?Box to Sphere Collision

+0

可能な重複:http://stackoverflow.com/questions/4578967/cube-sphere-intersection-test(「キューブ」と記されているが、答えはすべての軸に合わせたボックスに適用されます)。 –

答えて

1

説明したレベルでテストを続けたい場合は、幅、高さ、深さ= 2rの球の周囲にバウンディングボックスを配置できます。もちろん、これは、球上の「無極」または「非赤道」の点での衝突に対する誤検出のリスクを認めています。これを解決するには、これらの問題領域でのヒットテストの粒度を増やすために一連の階層バウンディングボックスを構築することを検討してください。

また、レンダリングレベルから問題に近づくこともあります。球をレンダリングすることはできないので、ある種の多角形メッシュが一般的に使用されます。 2D(または3D)ポリゴン間のヒットテストは簡単な方法です。

+0

ニースが見つかりました。リンクは最新であり、複数のケースをカバーしています。ソリッドボックス、ソリッドスフェアのアルゴリズムは、ほとんどのゲームエンジンが(さまざまな最適化された形式で)使用してきたものです。 – Kaganar

-2

球の中心からの距離に対して境界ボックスのすべてのコーナーをチェックするだけで済みます。

bool collidesWith(BoundingBox b, BoundingSphere s) { 
    for(Vertex v in b) { 
    if(distanceBetween(v, s.center) <= s.radius) 
     return true; 
    } 
    return false; 
} 
+4

これは、辺の1つのみが交差する場合は処理しません。 – corsiKa

+0

ああ、良い点 - ありがとう。 –

+0

OPが求めているように、軸に沿ったバウンディングボックスの周りに頂点を置くことはむしろ非典型です。もっと重要なことに、「ちょうど」は(既に指摘されているように)働いていないし、このケースでは少し遅すぎる。 – Dude

3

最初に確認するのは、BoundingSphereのBoundingBoxが交差しているかどうかです。その理由は、より複雑な数学を排除するのは非常に簡単な方法だからです。

次のステップは、境界ボックスの6つのプレーン(または12つの三角形)のそれぞれを取り、それらの点からポリゴンテストまでの距離を球の中心にすることです。それらの1つが球の半径よりも小さい場合は、ヒットします。ポリゴン・ツー・ポイントの距離について

MATLABコード:http://www.mathworks.com/matlabcentral/fileexchange/12744-distance-from-a-point-to-polygon

0

ジム・アルヴォにより、グラフィックス宝石の章があります。

URLに「arvo」と書かれているように、上の古いリンクは彼のコードを指していると思います。このlinkは動作します - 少なくとも今は。