2

OgreMOCを使用して物理シミュレーションを書いています。

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

球体と別のメッシュの間の衝突を検出する方法を知りたいです。

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

更新:これについては以前に言及する必要がありました。これを自分で開発する必要があるため(ユニプロジェクト)、サードパーティの物理ライブラリを使用できません。

4

2 に答える 2

9

ここで受け入れられている解決策は機能しません。メッシュ密度が一般的に十分に高く、メッシュ上の2つのポイントが衝突球の直径よりも離れていない場合にのみ、一種の作業が行われます。巨大な立方体メッシュのランダムベクトル上に短距離で発射された小さな球を想像してみてください。立方体メッシュには8つの頂点しかありません。立方体が実際にそれらの8つの頂点の1つに当たる確率はどれくらいですか?

これは、実際にはポリゴンごとの衝突で行う必要があります。ポリゴンと球の交点をチェックできる必要があります(さらに、前述のレイニエのようなトンネリングを避けたい場合は円柱)。このオンラインおよび書籍形式のリソースはかなりありますが、http://www.realtimerendering.com/intersections.htmlが出発点として役立つ場合があります。

最適化についてのコメントは良いです。早期の機会(おそらく、境界球またはメッシュの軸に沿った境界ボリュームに対する迅速なチェック)が不可欠です。バウンディングボリューム内にいると判断した場合でも、候補のリストからありそうもないポリゴン(遠すぎる、間違った方向を向いているなど)を取り除くことができるとよいでしょう。

于 2009-08-25T03:29:20.637 に答える
2

専用の物理ライブラリを使用するのが最善だと思います。

そうは言った。この問題について考えると、それほど難しくはないと思います。

球には中点と半径があります。メッシュ内のすべてのポイントについて、次の手順を実行します。

  1. ポイントが球の内側にあるかどうかを確認します。
  2. 以前に見つかったポイント(存在する場合)よりも中心に近いかどうかをチェックする場合
  3. もしそうなら...このポイントを衝突ポイントとして保存します

もちろん、このルーチンはかなり遅くなります。それをスピードアップするためのいくつかのこと:

  1. 最初の些細なリジェクトについては、最初にメッシュの境界球が衝突するかどうかを確認します
  2. 距離をチェックするときに平方根を計算しないでください...代わりに2乗の長さを使用してください。(はるかに高速です)
  3. メッシュのすべてのポイントを比較する代わりに、メッシュに次元空間分割アルゴリズム(quadtree / BSP)を使用して、ポイントのグループをすばやく除外します

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

于 2009-08-23T12:06:18.377 に答える