ゲームのアルゴリズムについて質問です。2つのキャラクターの衝突検知を、キャラクターが少しでも重なったかどうかで、判定します。2つのキャラクターは常に動いており、スピードも一定でないため、時々、重ならずにすり抜けてしまうことがあります。その場合、衝突検知できません。こうした場合の対処法が記載してあるサイトはあるでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/12/01 03:04:33
  • 終了:--

回答(2件)

id:ANSUKOEMU No.1

ANSUKOEMU回答回数12ベストアンサー獲得回数02005/12/01 19:34:23

ポイント100pt

http://d.hatena.ne.jp/ANSUKOEMU/

MAGNITUDE−Μ

URLはダミー

まず、2Dなのか3Dなのかで、難易度が大きく変わります。

ここでは2Dであるとの仮定で説明しておきます。


すり抜けが起こるのは、ある瞬間(大抵の場合、描画フレーム)での衝突しか考慮

していないためで、防止するには移動開始から移動完了までの途中もチェックを

かけてあげる必要があります。

あらゆるタイミングをチェックするのは無理なので、描画フレーム間を何分割か

して、描画はしないけど衝突チェックはするというタイミングを設けることで

改善できます。

描画フレームごとにチェックを行なっている場合、例えばフレーム間を4分割し、

描画+チェック、チェック、チェック、チェック、描画+チェック …

というように各タイミングでチェックは必ず行なうようにすれば、チェック間の

キャラクターの移動量は1/4になりますので、衝突判定の精度が向上します。


チェックの頻度が多くなりますので、瞬間ごとの衝突判定が重いと不利です。

特に、ビットマスクの重なりで衝突判定している場合、チェックの頻度を上げる

ことは速度的に難しくなってしまいます。

キャラクターの当り判定を円に置換えて、円どうしの重なりを判定することで

簡略化できます。

円Aと円Bの重なりチェックは、円Aの中心から[円Aの半径+円Bの半径]の範囲内に

円Bの中心があるかどうかを見ることでわかります。


円同士の判定の場合で更に速度が欲しいときは、描画フレーム間にキャラクタが

移動した軌跡を求めてベクトルで交差判定するというやり方もあります。

円Aの中心から[円Aの半径+円Bの半径]の範囲内に、円Bの移動ベクトル(移動前と

移動後の位置を結んだ半直線)に重なりがあるかをチェックします。

これをAとBの関係を入替えて相互に行なって、両方とも重なり有りとでれば

衝突があるとみなします。(長円どうしの重なり判定ということになります)

この考え方は、フレーム間にチェックのタイミングを設ける必要がありませんが、

キャラクタの大きさに対して移動量が大きすぎる場合、厳密には移動途中で当り

はないはずなのに衝突判定が出てしまったりする可能性もあります。

http://www.antun.net/tips/algorithm/collision.html

Atsushi's Homepage �` �Փ˔����̃A���S���Y��

円と線分の交差(球と線分の交差)については、ここが参考になります。

3D空間での衝突判定。

ベクトル等をわかりやすく解説。

id:loopring

衝突チェックの頻度を上げたり、円に置き換えたり、ベクトルを使うなど様々な方法があるんですね。

自分のケースの場合、2Dです。

まず、チェックのタイミングを増やす方法を試してみます。

詳細でわかりやすい回答、ありがとうございました。

2005/12/04 05:37:44
id:hichikawa No.2

hichikawa回答回数39ベストアンサー獲得回数02005/12/02 22:57:38

ポイント10pt

具体的な説明ではないですが,高校数学などでも扱うベクトル演算で二つのキャラクターの始点と終点をそれぞれ結ぶ直線の交点を求め,始点と終点の間にあるかを判定すればよいかと思います。

id:loopring

回答、ありがとうございます。

2005/12/04 05:38:02

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません