ページ 11

当たり判定 すり抜け回避

Posted: 2011年7月21日(木) 19:38
by
あまりプログラムの内容の質問ではないのですが...。

シューティングゲームの当たり判定で、
ベクトルを使って1フレームの敵と弾の動きの始点と終点をそれぞれ結ぶ直線の交点を求め、始点と終点の間にあるかを判定する方法では、
確実に弾が敵をすり抜けることはないのでしょうか?

敵の動きが変則的であったり、弾が異常なほど速かったりしたときには、すり抜けが起こってしまう気がするのですが、
実際はどうなのでしょうか?

また、この方法が確実でないのであれば、他にいい方法はありますでしょうか?

よろしくお願いします。

Re: 当たり判定 すり抜け回避

Posted: 2011年7月21日(木) 20:47
by h2so5
black_cat さんが書きました: ベクトルを使って1フレームの敵と弾の動きの始点と終点をそれぞれ結ぶ直線の交点を求め、始点と終点の間にあるかを判定する方法では、
確実に弾が敵をすり抜けることはないのでしょうか?
この方法だとすり抜けることは無いと思いますが、
逆に、本当は当たっていないのに当たりと判定されてしまうことはあると思います。

敵と弾の軌道の線分に交点が存在するということは、
そのフレーム中に同じ座標を通過するということを示しますが、その時間が同じであるとは限りません。

Re: 当たり判定 すり抜け回避

Posted: 2011年7月21日(木) 20:51
by GRAM
いくらでも例外は考えられると思います
まず一つ目として、ただ線分同士の交点を求めるのでは、ボリュームは全く考慮されていないことになります。

たとえば以下のような場合円のスウィープボリューム同士は交差しているにもかかわらず
中心点を結んだ線分同士は交差していません。これは明らかな判定の誤りです。
sweep.png
sweep.png (4.54 KiB) 閲覧数: 6632 回
また同時に上の例でスウィープしたボリュームを考慮したとした場合、本当に交差しているのか(またしたのか)の判断はつかないでしょう
(時間の考慮がなされておらず、実際に衝突したか否かはこのフレーム内にどういう運動をしていたかに完全に依存する)

線分同士の交差を判定基準にするには
あたっているものを当たっていないと判定するかもしれないし、その逆もあり得る

スウィープボリュームを用いて判定の材料にする場合
基本的に当たっているものは当たっていると判定するが、当たっていないものも当たっていると判定する可能性がある

といった感じでしょうね。

後者の場合の問題点は両物体が移動していることに起因するエラーといえるでしょう。
実際片方の物体が静止していれば、上のような判定ミスは起こりえないといえます
sweep.png
sweep.png (6.12 KiB) 閲覧数: 6632 回
よってより厳密に判定を行うには
①1フレーム内の移動は等速直線運動だと仮定する
②両物体の相対速度をとり、運動を片方の物体に固定された座標系での運動で考える
ここまでで運動する物体と運動しない固定された物体との判定に持ち込めます
③スウィープボリュームと通常のボリュームとの判定を行う

これで終わりですね。
円同士の判定の場合は最終的に線分と円の判定に持ち込めます
③を詳しくいうのなら
固定された方の円の半径にスウィープする円の半径を加算し、
スウィープする円の中心間を結んだ線分と、新たにできるより大きな固定された円とのあたり判定をとってやればいいです。
sweep.png
sweep.png (7.45 KiB) 閲覧数: 6632 回
という感じに、どうしてもって場合は自分ならしますが、ふつうここまでする必要はないと思います。

Re: 当たり判定 すり抜け回避

Posted: 2011年7月21日(木) 22:33
by
>h2so5さん
h2so5 さんが書きました:本当は当たっていないのに当たりと判定されてしまうことはあると思います。
それです!!
多分そのことを考えていたんだと思います!
なにかもやもやしていたものがスッキリしましたぁ~
h2so5 さんが書きました:敵と弾の軌道の線分に交点が存在するということは、
そのフレーム中に同じ座標を通過するということを示しますが、その時間が同じであるとは限りません。
たしかにそうですね!
きちんとした理由も理解できました。
ありがとうございました!



>GRAMさん
わざわざ図まで用意していただいてありがとうございます!物凄くわかりやすかったです!

厳密に判定を行う方法、とても納得がいって思わずにやにやしてしまいましたw
GRAM さんが書きました:どうしてもって場合は自分ならしますが、ふつうここまでする必要はないと思います。
というのは、ここまでの処理をしなくてもあまり目立たないということでしょうか?

Re: 当たり判定 すり抜け回避

Posted: 2011年7月21日(木) 23:18
by GRAM
black_cat さんが書きました:というのは、ここまでの処理をしなくてもあまり目立たないということでしょうか?
そうですね。
この方法だといくつか書いていない問題点があります。
①スウィープすると応答(跳ね返りなど)の処理がめんどくさくなる
②よくある話ですが重い(座標変換に線分との判定がついて回りますので)

という感じです。ことは1/60秒に行われているので、よほどのことがない限り最初の線分の方法でエラーが目立たないと思うのです。
もちろん気になるのでしたら必要なことかもしれませんが・・・

Re: 当たり判定 すり抜け回避

Posted: 2011年7月22日(金) 13:21
by
GRAM さんが書きました:よくある話ですが重い(座標変換に線分との判定がついて回りますので)
やはり重くなるのですね。
あまり目立たないということなので、今回は最初の方法でいこうと思います。

いろいろ教えてくださってありがとうございました!
とても勉強になりました!