« リセット | トップページ | 小技 »

2008年3月27日 (木)衝突?

おはようございます。本日の当番のM.L.Kです(LはLineのLです。Line&Circle!)。

というワケで、collision判定の話でございます。
やっぱり、韓国料理や犬の話ではありませんので、あしからず。

さて、一般的なアクションゲームでは、2D・3Dに関わらず、必ず何らかの接触判定や、交差判定を行っています。

2008_0326_01

図で表してみました。パッと見で当たっている・当たっていないが判別できますネ。
この図のように、ある一瞬を切りとった状態を判別するのは、コンピュータでもそれほど難しくはありません。
もちろん、人間のように、全体の様子を並列処理的に判断できないため、判別するオブジェクトの数が多くなれば、それなりに時間はかかってしまうのですが、当たっているか否かの判別自体は簡単な代数幾何の計算で求めることができます(上の図で言えば、球の中心から壁までの距離が球の半径より長いか短いか、それだけ)。

一般的なコンピュータゲームは、1フレームという単位時間で管理されていますが、上の図は、ある1フレームにおける幾何的な状態を判断している、ということになります。

では、次のような場合はどうでしょう?

2008_0326_02

左側にあった球が、1フレームの経過によって、右側へ直線移動する(正確に言えば、する予定)、という図です。

人間ですと、図示されていない途中の経過を予測できるため、即座に判断することができます。この程度を予測できないのは、ラブコメ漫画の遅刻しそうな主人公くらいなものです。
一方、上で説明したような1フレームで時間を管理しているコンピュータは、単にこの図を代数幾何的に判断するだけでは、当たりを判断することはできません。
「球は壁の左側にあります。移動後の位置では、壁の右側にあります。で?」
てな、カンジです。
まあ、0.5フレームとかそういう中途半端な時間が存在しませんから、無茶というもの。

というワケで、多くのプログラマは“移動の当たりを飛ばす”という処理を施します。
あるオブジェクトが1フレーム後までに移動する軌跡を線分として表現し、その線分と他のオブジェクトの交差判定を行う、というものです。

2008_0326_03

図でいえば、こんなカンジ。
球の中心から突き出た矢印が、飛ばされた当たり。
1フレームの間に、この矢印の距離を移動するハズなので、この矢印と壁とが交差すれば、当然、オブジェクトは壁に衝突するだろう、という思惑です。
時間の経過という概念を、空間的に表現する手法ですね。
ゲーム開発の現場で「当たりを飛ばす」とよく言っているのは、こういう意味です。豆知識。

でもこの手法、判定の相手が動いていたりすると、正確な判定ができなかったりします。

2008_0326_04

この図、本来であれば、2つの直線が交わるあたりで衝突することになりそうですが、その場所には、まだ相手のオブジェクトが存在していないので、当たり判定には失敗してしまいます。
もしこれが思春期な2人だったら、芽生えるものも芽生えない、って寸法。
フラグもばっきばきですネ。

こういった由々しき問題に対処するためには、時間で微分してみたりだとか、確率の濃度を使ってみたりだとか、どろどろとした小難しい考え方が必要になってしまいます。
あんなにもピュアでやさしかったのに、残念な話です。

まあ、実際のゲームでは、直線の判定でも破綻をきたさないように、プランナーさんと仕様レベルで相談することになるんですが、それはまた、別のお話。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2008/03/post_6fc4.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« リセット | トップページ | 小技 »

プログラマー」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 衝突?:

« リセット | トップページ | 小技 »