canopus

円柱とか球とか衝突判定とか

アバター
ibrn
記事: 1
登録日時: 13年前

円柱とか球とか衝突判定とか

投稿記事 by ibrn » 12年前

このまま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]

案外ラクに求まりました。
次は多分、線分と線分の衝突判定。
最後に編集したユーザー ibrn on 2012年8月23日(木) 00:50 [ 編集 1 回目 ]

アバター
GRAM
記事: 164
登録日時: 14年前

RE: 円柱とか球とか衝突判定とか

投稿記事 by GRAM » 12年前

初めまして。
衝突判定はどうしても突っ込みたくなってしまう性分なんで許してくださいm(_ _)m
円柱と球との衝突判定はちょいと間違っていると思います。

一般に円柱との衝突判定というのは若干難しいのですが、どこら辺が怪しいかというと円柱の底面付近です
無題2.png
無題2.png (11.3 KiB) 閲覧数: 502 回
この例は円柱を横から見た図ですが、条件①式で衝突していないと判断されます。
まぁそれでも球同士の段階で見逃されないとおっしゃるかもですが、円柱と球という考え方においては抜けてしまいますね。
実はカプセルと球との衝突判定はもっともっと単純で、
単純に線分と点との距離の問題です。


つまり、カプセルの中心線のベクトルbと、片方の底面の中心から円の中心までのベクトルaを求めて以下の計算をすれば求まります
無題2.png
無題2.png (11.32 KiB) 閲覧数: 498 回
図のようにaをbに射影して係数tを求めます。

tはaをbに射影した点までbを何倍したらよいかという係数です。

さて、衝突判定は以下のようにできます

①t 1なら
逆側の底面から球の中心までのベクトルを求めて①と同様にすればよいでしょう

③0≦t≦1なら
t*b-aの大きさを求めて、カプセルと球の半径の和以下なら衝突しています。(線分と中心点との距離が半径の和以下

実はt1ならt=1とすることで、③のみを使って判定できます。
関数化すれば3行くらいで書けるかなと思います。

衝突判定はいかにシンプルに問題を整理するかにかかってるかなぁ~と思います。

アバター
ibrn
記事: 1
登録日時: 13年前

Re: 円柱とか球とか衝突判定とか

投稿記事 by ibrn » 12年前

わーい初めてのコメントだ!ありがとうございますw

なるほど、確かに円柱と球だとその部分はやばいですね。
点と円柱ならコレでいいかなぁと思いながらいきなりカプセルの実装やったのが失敗でした

確かに射影で求める方法のが計算コスト安く済みますね。
スマートでちょっとびっくりしましたw ありがとうございます!