3

私は C# で数年間コーディングしてきましたが、今ではゲームを作成するために XNA フレームワークを試してみることにしました。

非常に単純なゲームに衝突処理を実装するまでは、うまくいきました。

BoundingBoxes と BoundingSpheres を使用して衝突検出を行う方法は理解できますが、ゲームのリフレッシュ レートを確認した後、2 つの衝突するオブジェクトが衝突として検出されないかどうかがすぐに気になりました。

例を挙げて説明してみましょう: - キャラクターが別のキャラクターを銃で撃っている場合。- 弾丸が他のキャラクターに向かってまっすぐ進んでいる。- 弾丸はキャラクターの直前にレンダリングされます。- 弾丸の速度が速いため、キャラクターの反対側にレンダリングされるようになりました。

このシナリオでは、弾丸とキャラクターが衝突した状態でレンダリングされることはないため、弾丸とキャラクターが衝突することはありません。

では、このシナリオで衝突を確実に検出するにはどうすればよいでしょうか?

4

2 に答える 2

1

非常に動きの速いオブジェクトの場合、説明したシナリオでは通常のアプローチは失敗します。チェックする必要があるのは、2 つの連続するゲーム ティックの間に弾丸がアイテムと衝突したかどうかです。これは、連続衝突検出と呼ばれます(これはかなり関連する SO 投稿です)

これを行うには、基本的に、現在の位置にある弾丸のバインディング ボックスの中央と、古い位置からのボックスの中央の間にレイをキャストし、それが他のブロック/球体と衝突するかどうか確認します。これはかなり高速な解決策であり、弾丸が十分に小さい場合はうまく機能するはずです。

精度を高めるために、現在の弾丸ボックスの各コーナーから 4 つの異なるいわゆるコリジョン レイを、前のゲーム ティックの対応する位置にキャストできます。まれに、弾丸よりも小さい高速アイテムの場合、これも失敗する可能性があることに注意してください。この場合、より高度な衝突検出システムが必要になります。しかし、これはごくまれなケースです。

追加の精度が必要な場合は、 Bulletなどの無料の 3D 物理ライブラリが解決策になる可能性があります。XNA のバインディングもあります。

于 2012-07-21T13:16:33.410 に答える
1

I think your problem is in tunneling that matches your description.

I recommend you to use Box2D physics engine for XNA. It's fast, simple and will avoid your any problems with collisions in your game.

Check in this manual on 4th page continuous collision and check how Box2D deal with tunneling effect.

于 2012-07-21T13:27:43.200 に答える