1

さまざまな形のオブジェクトで満たされた部屋があるプロジェクトを行っています。

私は部屋を絵の具で描いています。絵はすべて白く、壁/障害物はすべて赤く塗っています。

ペイントを使用して、各可動オブジェクトを別のファイルに描画しています。

ここで、部屋のマップとオブジェクトの両方を 1 と 0 のマトリックスとしてプログラムにロードします。最初のマトリックスと、部屋にロードするオブジェクトごとに別のマトリックスがあります。

オブジェクトは部屋の中を自由に移動でき、任意の距離、任意の角度で移動し、回転することができます。オブジェクトを任意の角度で回転させ、衝突を検出できるようにする方法を考案するにはどうすればよいですか? つまり、オブジェクトが上下左右に移動できる場合、両方のマトリックスをチェックして、それらがいずれかの 1 と「オーバーラップ」しているかどうかを確認できます。しかし、オブジェクトをたとえば 10 度回転させたい場合、それを行列に変換して壁の行列と照合する方法がわかりません。

行列表現を削除して数学的領域を作成し、ライブラリを使用して IR^2 計算で処理するようにこれを処理する必要がありますか? 計算的にはかなり高価ではないでしょうか?

これを行う簡単な方法は何ですか?一流の方法である必要はありませんが、複雑なアルゴリズムに使用しているため、これを使用して各反復で計算時間を失いたくありません。

4

3 に答える 3

1

これはおそらくあなたの質問に完全に答えるわけではありませんが、役立つかもしれません. 私が書いていた小さなゲームで衝突検出を行っていたとき、オブジェクトを囲む衝突「ヒット ボックス」と、より複雑な検出方法を使用していました。2 つのヒット ボックスがオーバーラップするまで複雑な方法を使用する必要はありません。その後は、空間内のすべてのオブジェクトから他のすべてのオブジェクトへのすべてのオブジェクトではなく、2 つのオブジェクトの衝突のみを計算する必要があります。

于 2009-11-23T15:18:45.277 に答える
1

私は何年も前に同様のことをしました。私の 3D シーンの各オブジェクトは、基本的な壁/床/天井のオブジェクト パターンで構成されていました。各オブジェクトは、独自の境界球を持つメッシュでした。次に、衝突を検出するために、最初にカメラの境界球を各オブジェクトの境界球に対してテストし、それらが衝突した場合は、より正確な衝突テスト (メッシュ/球) を実行しました。

十分に高速で (Duron 600 MHz)、実装も非常に簡単でした。

あなたのシナリオでは、多くの動的オブジェクトがあるようです (私のプロジェクトでは移動オブジェクトとしてカメラしか持っていませんでした)。

于 2009-11-23T15:41:02.737 に答える
0

両方のボディを半径 R1 と R2 の球体 (コリジョン カプセル) として近似することをお勧めします。

この場合、次のことを説明する必要があります。

1 - 2 つのボディの半径。この場合、敵は半径 0 のポイントになり、弾丸の半径は getBulletSize(); になります。

2 - アニメーション フレーム中の弾丸と敵の速度は 0<=t<=1 です。

衝突のケースは |r1 + r2| のときに発生します。< d、ここで、d は両方の物体の重心間の距離です。

d は P(t) - Q(t) として与えられ、Q と P は両方のオブジェクトの重心です。P(t) = P0 + Vp t. Q(t) = Q0 + Vq t.

Vp = P1 - P0; Vq = Q1 - Q0;

=> d = P(t) - Q(t)

(R1 + R2)^2 = (P(t) - Q(t))^2 の場合を解くと、衝突の時間が生成されます。この公式を恐れないでください!これは単純な 2 次多項式に解決され、その 2 次式が t について解決されます。式で B^2 > 0 の場合、時間が最小のときに最初の面衝突が発生します!

衝突事例:

次の場合に発生します。

1) 0 <= t <= 1。

予備チェック:

2) 最小 d (半径条件の導関数 = 0) は < R1 + R2 でなければなりません

また、リーフ密度 (セルあたりのプリミティブ数) 条件を使用してオブジェクト メッシュのバウンディング ボリューム階層を作成することにより、これを強化することもできます。最初の衝突テストは、ルートから下に向かって繰り返され、カプセルの順序による近似を処理します。

于 2016-05-06T11:31:16.840 に答える