このままROM専やってるのもアレなので、ぼちぼち記事書こうかと。。
ゲーム系では必ずと言っていいほど通る衝突判定。
僕はあまり数学物理が得意じゃないので、自分で判定処理のアルゴリズムを組むのは苦労しました。
そのなかでも結構悩んだのは、球体とカプセルの衝突判定。
カプセルというのは、円柱の両端に球がついている形状の物体を指します。
これと球が衝突しているかの判定アルゴリズムを考えてみましょう。ちなみに3次元です。
まず、プログラム上で物体をどう定義するかを考えます。
球は簡単ですね。中心(x,y,z)、半径rで定義できます。何かと衝突する時、
対象物との距離が球の半径を下回っていれば衝突フラグです。
ならカプセルはどうするか?
カプセルは、円柱と球体部分を分けて考えます。そうすると、2球と円柱との複合判定になります。
円柱を座標上にどう定義するのか手こずったのですが。。
どうやら円柱は始点と終点を持った半径rの直線だと考るのが手っ取り早そうです。
そう考えると、円柱と対象物の衝突判定は次の2つを同時に満たすことで定義できます。
①円柱の始点から終点の間に対象物がある
②円柱の中心線と対象の距離が半径以内である
①は、対象物と円柱の始点or終点を結ぶベクトルと、円柱の中心線との内積を取れば簡単にわかります。
ベクトルABの内積が0= 0 &&
dot_top >= 0 &&
Line( cpsl_bottom , cpsl_top , sphere )
<= cpsl_r + sphere_r;
return h;
}
[/code]
案外ラクに求まりました。
次は多分、線分と線分の衝突判定。
canopus
円柱とか球とか衝突判定とか
RE: 円柱とか球とか衝突判定とか
初めまして。
衝突判定はどうしても突っ込みたくなってしまう性分なんで許してくださいm(_ _)m
円柱と球との衝突判定はちょいと間違っていると思います。
一般に円柱との衝突判定というのは若干難しいのですが、どこら辺が怪しいかというと円柱の底面付近です
この例は円柱を横から見た図ですが、条件①式で衝突していないと判断されます。
まぁそれでも球同士の段階で見逃されないとおっしゃるかもですが、円柱と球という考え方においては抜けてしまいますね。
実はカプセルと球との衝突判定はもっともっと単純で、
単純に線分と点との距離の問題です。
つまり、カプセルの中心線のベクトルbと、片方の底面の中心から円の中心までのベクトルaを求めて以下の計算をすれば求まります
図のようにaをbに射影して係数tを求めます。
tはaをbに射影した点までbを何倍したらよいかという係数です。
さて、衝突判定は以下のようにできます
①t 1なら
逆側の底面から球の中心までのベクトルを求めて①と同様にすればよいでしょう
③0≦t≦1なら
t*b-aの大きさを求めて、カプセルと球の半径の和以下なら衝突しています。(線分と中心点との距離が半径の和以下
実はt1ならt=1とすることで、③のみを使って判定できます。
関数化すれば3行くらいで書けるかなと思います。
衝突判定はいかにシンプルに問題を整理するかにかかってるかなぁ~と思います。
衝突判定はどうしても突っ込みたくなってしまう性分なんで許してくださいm(_ _)m
円柱と球との衝突判定はちょいと間違っていると思います。
一般に円柱との衝突判定というのは若干難しいのですが、どこら辺が怪しいかというと円柱の底面付近です
この例は円柱を横から見た図ですが、条件①式で衝突していないと判断されます。
まぁそれでも球同士の段階で見逃されないとおっしゃるかもですが、円柱と球という考え方においては抜けてしまいますね。
実はカプセルと球との衝突判定はもっともっと単純で、
単純に線分と点との距離の問題です。
つまり、カプセルの中心線のベクトルbと、片方の底面の中心から円の中心までのベクトルaを求めて以下の計算をすれば求まります
図のようにaをbに射影して係数tを求めます。
tはaをbに射影した点までbを何倍したらよいかという係数です。
さて、衝突判定は以下のようにできます
①t 1なら
逆側の底面から球の中心までのベクトルを求めて①と同様にすればよいでしょう
③0≦t≦1なら
t*b-aの大きさを求めて、カプセルと球の半径の和以下なら衝突しています。(線分と中心点との距離が半径の和以下
実はt1ならt=1とすることで、③のみを使って判定できます。
関数化すれば3行くらいで書けるかなと思います。
衝突判定はいかにシンプルに問題を整理するかにかかってるかなぁ~と思います。
Re: 円柱とか球とか衝突判定とか
わーい初めてのコメントだ!ありがとうございますw
なるほど、確かに円柱と球だとその部分はやばいですね。
点と円柱ならコレでいいかなぁと思いながらいきなりカプセルの実装やったのが失敗でした
確かに射影で求める方法のが計算コスト安く済みますね。
スマートでちょっとびっくりしましたw ありがとうございます!
なるほど、確かに円柱と球だとその部分はやばいですね。
点と円柱ならコレでいいかなぁと思いながらいきなりカプセルの実装やったのが失敗でした
確かに射影で求める方法のが計算コスト安く済みますね。
スマートでちょっとびっくりしましたw ありがとうございます!