2009-08-23 17 views
2

OgreMOCを使用して物理シミュレーションを作成しています。メッシュと球の衝突点を検出しますか?

私は球をカメラの位置から撮影し、カメラの前方ベクトルを使ってカメラが向いている方向に移動します。

ポイントと球と別のメッシュとの衝突をどのように検出できるか知りたいと思います。

MOCまたはOGREを使用して2つのメッシュ間の衝突点を確認するにはどうすればよいですか?

更新:これは先に説明したはずです。私はこれを自分で開発する必要があるので、第三者の物理ライブラリを使用することはできません(ユニプロジェクト)。

答えて

2

私は、特殊な物理ライブラリを使うのが最善だと思います。

と言われています。この問題について私が考えると、それほど難しいとは思わないでしょう:

球は中点と半径を持っています。メッシュ内のすべての点について、以下を実行します。

  1. 点が球の内側にあるかどうかを確認します。
  2. それは以前に見つかった時点(もしあれば)
  3. よりも中心に近い場合、それは...もちろん衝突点

としてこのポイントを保存しなければ、それは、このルーチンをチェックしない場合かなり遅いでしょう。それをスピードアップするために いくつかのための:

  1. 最初の些細な拒絶のメッシュの境界球は距離をチェックするとき
  2. がsquarerootsをカルクていない衝突した場合、最初の二乗の長さを使用して参照してください...代わりに。(ずっと速く)
  3. の代わりに、メッシュのすべてのポイントを比較したが、すぐにポイントのグループを除外するためにメッシュのための三次元空間分割アルゴリズム(クワッド/ BSP)を使用

ああ...とこのルーチンは、球があまりにも速く移動しない場合にのみ機能します(rメッシュに対してエイリアス)。非常に高速で、1秒間にX回サンプリングすると、球がすべて衝突することなくメッシュを通過する可能性があります。これを克服するには、基本的にあなたの球体をチューブにする「スウィープボリューム」を使用する必要があります。数学を指数関数的に複雑にする。

+3

あなたのメッシュがあなたの球に対して大きい場合、接続するエッジが球と交差する球の外に2点を得ることができます。もちろん、あなたのコンテキストでこれを取得しない場合は、球面内テストを行うことができます。 – geofftnz

8

ここでフラットアウトされた解決策は機能しません。メッシュの密度が一般に高いので、メッシュ上の2つの点が衝突球の直径よりも離れていない場合は、作業の種類だけで済むでしょう。小さな球が、huuugeキューブメッシュのランダムベクトル上で短距離で発射されたと想像してください。キューブメッシュには8つのバーテッドしかありません。キューブが実際にその8つのバーテンのうちの1つを打つことになる確率はどれくらいですか?

これは実際にポリゴンごとの衝突で実行する必要があります。ポリゴンと球の交差をチェックすることができなければなりません(また、上記のようなトンネルを避けたい場合はシリンダを追加する必要があります)。このオンライン版と本の書式ではかなりのリソースがありますが、http://www.realtimerendering.com/intersections.htmlが便利な出発点です。

最適化に関するコメントは良いです。早期の機会(おそらく、境界球またはメッシュの境界整列ボリュームに対する素早いチェック)が不可欠です。バウンディングボリューム内にいると判断したとしても、潜在的な候補者のリストからポリゴンを外すこと(余りにも遠く、間違った方向に向くなど)を取り除くことは、おそらく良い考えです。

+0

これを指摘してくれてありがとう。私はその事件を完全に逃した。しかし、メッシュと球のサイズが同じであるか、球がより大きいソリューションでは、彼は正しく機能するでしょうか? – Toad

+0

その解決策のための@Toad境界球との交差点が機能する可能性があります。 – AgentFire