あまりプログラムの内容の質問ではないのですが...。
シューティングゲームの当たり判定で、
ベクトルを使って1フレームの敵と弾の動きの始点と終点をそれぞれ結ぶ直線の交点を求め、始点と終点の間にあるかを判定する方法では、
確実に弾が敵をすり抜けることはないのでしょうか?
敵の動きが変則的であったり、弾が異常なほど速かったりしたときには、すり抜けが起こってしまう気がするのですが、
実際はどうなのでしょうか?
また、この方法が確実でないのであれば、他にいい方法はありますでしょうか?
よろしくお願いします。
当たり判定 すり抜け回避
Re: 当たり判定 すり抜け回避
この方法だとすり抜けることは無いと思いますが、black_cat さんが書きました: ベクトルを使って1フレームの敵と弾の動きの始点と終点をそれぞれ結ぶ直線の交点を求め、始点と終点の間にあるかを判定する方法では、
確実に弾が敵をすり抜けることはないのでしょうか?
逆に、本当は当たっていないのに当たりと判定されてしまうことはあると思います。
敵と弾の軌道の線分に交点が存在するということは、
そのフレーム中に同じ座標を通過するということを示しますが、その時間が同じであるとは限りません。
Re: 当たり判定 すり抜け回避
いくらでも例外は考えられると思います
まず一つ目として、ただ線分同士の交点を求めるのでは、ボリュームは全く考慮されていないことになります。
たとえば以下のような場合円のスウィープボリューム同士は交差しているにもかかわらず
中心点を結んだ線分同士は交差していません。これは明らかな判定の誤りです。 また同時に上の例でスウィープしたボリュームを考慮したとした場合、本当に交差しているのか(またしたのか)の判断はつかないでしょう
(時間の考慮がなされておらず、実際に衝突したか否かはこのフレーム内にどういう運動をしていたかに完全に依存する)
線分同士の交差を判定基準にするには
あたっているものを当たっていないと判定するかもしれないし、その逆もあり得る
スウィープボリュームを用いて判定の材料にする場合
基本的に当たっているものは当たっていると判定するが、当たっていないものも当たっていると判定する可能性がある
といった感じでしょうね。
後者の場合の問題点は両物体が移動していることに起因するエラーといえるでしょう。
実際片方の物体が静止していれば、上のような判定ミスは起こりえないといえます よってより厳密に判定を行うには
①1フレーム内の移動は等速直線運動だと仮定する
②両物体の相対速度をとり、運動を片方の物体に固定された座標系での運動で考える
ここまでで運動する物体と運動しない固定された物体との判定に持ち込めます
③スウィープボリュームと通常のボリュームとの判定を行う
これで終わりですね。
円同士の判定の場合は最終的に線分と円の判定に持ち込めます
③を詳しくいうのなら
固定された方の円の半径にスウィープする円の半径を加算し、
スウィープする円の中心間を結んだ線分と、新たにできるより大きな固定された円とのあたり判定をとってやればいいです。 という感じに、どうしてもって場合は自分ならしますが、ふつうここまでする必要はないと思います。
まず一つ目として、ただ線分同士の交点を求めるのでは、ボリュームは全く考慮されていないことになります。
たとえば以下のような場合円のスウィープボリューム同士は交差しているにもかかわらず
中心点を結んだ線分同士は交差していません。これは明らかな判定の誤りです。 また同時に上の例でスウィープしたボリュームを考慮したとした場合、本当に交差しているのか(またしたのか)の判断はつかないでしょう
(時間の考慮がなされておらず、実際に衝突したか否かはこのフレーム内にどういう運動をしていたかに完全に依存する)
線分同士の交差を判定基準にするには
あたっているものを当たっていないと判定するかもしれないし、その逆もあり得る
スウィープボリュームを用いて判定の材料にする場合
基本的に当たっているものは当たっていると判定するが、当たっていないものも当たっていると判定する可能性がある
といった感じでしょうね。
後者の場合の問題点は両物体が移動していることに起因するエラーといえるでしょう。
実際片方の物体が静止していれば、上のような判定ミスは起こりえないといえます よってより厳密に判定を行うには
①1フレーム内の移動は等速直線運動だと仮定する
②両物体の相対速度をとり、運動を片方の物体に固定された座標系での運動で考える
ここまでで運動する物体と運動しない固定された物体との判定に持ち込めます
③スウィープボリュームと通常のボリュームとの判定を行う
これで終わりですね。
円同士の判定の場合は最終的に線分と円の判定に持ち込めます
③を詳しくいうのなら
固定された方の円の半径にスウィープする円の半径を加算し、
スウィープする円の中心間を結んだ線分と、新たにできるより大きな固定された円とのあたり判定をとってやればいいです。 という感じに、どうしてもって場合は自分ならしますが、ふつうここまでする必要はないと思います。
Re: 当たり判定 すり抜け回避
>h2so5さん
多分そのことを考えていたんだと思います!
なにかもやもやしていたものがスッキリしましたぁ~
きちんとした理由も理解できました。
ありがとうございました!
>GRAMさん
わざわざ図まで用意していただいてありがとうございます!物凄くわかりやすかったです!
厳密に判定を行う方法、とても納得がいって思わずにやにやしてしまいましたw
それです!!h2so5 さんが書きました:本当は当たっていないのに当たりと判定されてしまうことはあると思います。
多分そのことを考えていたんだと思います!
なにかもやもやしていたものがスッキリしましたぁ~
たしかにそうですね!h2so5 さんが書きました:敵と弾の軌道の線分に交点が存在するということは、
そのフレーム中に同じ座標を通過するということを示しますが、その時間が同じであるとは限りません。
きちんとした理由も理解できました。
ありがとうございました!
>GRAMさん
わざわざ図まで用意していただいてありがとうございます!物凄くわかりやすかったです!
厳密に判定を行う方法、とても納得がいって思わずにやにやしてしまいましたw
というのは、ここまでの処理をしなくてもあまり目立たないということでしょうか?GRAM さんが書きました:どうしてもって場合は自分ならしますが、ふつうここまでする必要はないと思います。
Re: 当たり判定 すり抜け回避
そうですね。black_cat さんが書きました:というのは、ここまでの処理をしなくてもあまり目立たないということでしょうか?
この方法だといくつか書いていない問題点があります。
①スウィープすると応答(跳ね返りなど)の処理がめんどくさくなる
②よくある話ですが重い(座標変換に線分との判定がついて回りますので)
という感じです。ことは1/60秒に行われているので、よほどのことがない限り最初の線分の方法でエラーが目立たないと思うのです。
もちろん気になるのでしたら必要なことかもしれませんが・・・
Re: 当たり判定 すり抜け回避
やはり重くなるのですね。GRAM さんが書きました:よくある話ですが重い(座標変換に線分との判定がついて回りますので)
あまり目立たないということなので、今回は最初の方法でいこうと思います。
いろいろ教えてくださってありがとうございました!
とても勉強になりました!