
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜〜〜

マイケル
今日も引き続き、ゲーム数学を進めていくよ!
今回は「球と線分の衝突判定」についてだ!
今回は「球と線分の衝突判定」についてだ!

エレキベア
また衝突判定クマか〜〜

マイケル
前回は円と線分の衝突判定だったけど、
少しレベルアップして三次元での衝突判定処理だ!
少しレベルアップして三次元での衝突判定処理だ!

マイケル
数学の知識が必要になってくるけど
がんばっていこう!!
がんばっていこう!!

エレキベア
次元が変わるくらいどうってことないクマ〜〜〜
参考書籍と開発言語

マイケル
勉強にするにあたっては前回同様、下記参考書を参考にしました!

マイケル
どちらも高校数学の基礎から解説しているため、しばらく数学から離れている方でも読みやすいと思います!

エレキベア
一読してみるクマ

マイケル
そしてサンプルプログラムの実装としては p5.js を使用しています!
気になった方はこちらも使用してみてくださいね!
気になった方はこちらも使用してみてくださいね!

エレキベア
グラフィックス特化のJavaScriptライブラリクマね
球と線分の衝突判定

マイケル
それじゃ早速やっていこう!
考え方

マイケル
考え方としては、球の方程式と直線の方程式を使います!

エレキベア
懐かしい式が出てきたクマね〜〜〜〜

マイケル
問題はどうやって衝突の判定を行うか!
線分の始点と終点は、下記のようになります。
つまり球と線分の交点のtの値が0〜1の時に線分の範囲であるといえます!
線分の始点と終点は、下記のようになります。
つまり球と線分の交点のtの値が0〜1の時に線分の範囲であるといえます!

エレキベア
なるほどクマ!
でも球と線分の交点はどうやって求めるクマ?
でも球と線分の交点はどうやって求めるクマ?

マイケル
球の方程式と直線の方程式を使って求めることができるんだ!
下記のように、球の方程式に直線の方程式を代入してみよう!
下記のように、球の方程式に直線の方程式を代入してみよう!

マイケル
そして、下記のようにまとめながら展開します!

エレキベア
これはどこかで見たことがあるような形クマ

マイケル
そう、二次方程式だ!
a、b、cをそれぞれまとめると、下記のように解の公式で解くことができる!
a、b、cをそれぞれまとめると、下記のように解の公式で解くことができる!

エレキベア
解の公式なつかしクマ〜〜

マイケル
解の公式は±で2種類あるから、最小値(最寄り)のtを求めて0〜1の間にあるかどうかを判定すれば衝突しているかどうかが分かるんだ!

エレキベア
最初に衝突した最寄りのtの値を求めるクマね
実装

マイケル
これまでの考え方を実装したものが以下になります!

エレキベア
ややこしそうクマが、さっきの話を思い出すとなんとなく分かるクマね

マイケル
こちらのコードを使ってシミュレータを作ってみたので、
よければ触ってみてください!
よければ触ってみてください!
See the Pen
0319_01_COLISION by masarito617 (@masarito617)
on CodePen.
↑球と線分の衝突判定

マイケル
下記のように、正常に衝突判定が行えていることが確認できます!

エレキベア
やったクマ〜〜〜〜〜
球と直線の衝突判定

マイケル
ここからはおまけですが、球と直線の衝突処理についても紹介します!
実装

マイケル
処理内容はほぼ同じですが、直線のためtの範囲を判定する必要がありません!
「b^2-4ac」の値が0以上かどうかのみ判定することで、衝突有無が分かります!
「b^2-4ac」の値が0以上かどうかのみ判定することで、衝突有無が分かります!

エレキベア
平方根を求める部分が負の値の場合は解が見つけられないクマね

マイケル
こちらのコードを使ったシミュレータは以下になります!
See the Pen
0319_02_COLISION by masarito617 (@masarito617)
on CodePen.
↑球と直線の衝突判定

マイケル
こちらも下記のように衝突判定を行えていることが分かります!

エレキベア
ちょろいクマ〜〜〜〜
おわりに

マイケル
というわけで今回は球と直線の衝突判定でした!
どうだったかな?
どうだったかな?

エレキベア
計算が少し複雑だったクマが、少しずつ解くと分かったクマ

マイケル
衝突処理は引き出しとして覚えて損はないからどんどん覚えていこう!

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜〜〜〜〜〜
【ゲーム数学】第五回 p5.jsで学ぶゲーム数学「球と線分の衝突判定」 〜完〜