フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんにちは。あんまり長くなるので同日更新です。同じ日にこの記事を更新しています。さて再び壁にぶち当たるShiroですが、今回は本当に壁です。そう、壁の当たり判定です。

今作の、ほぼ物理シミュレーションな当たり判定を実装するのは初めてということもあり、アルゴリズムやファイルフォーマットは随分粗雑な作りでした。そして壁に至っては凸になっている角に接触すると振動するという不具合まで抱えていました。ちょうどタスクシステムのせいで多くのコードを書き直すので、当たり判定も改良しようというのが今回の話です。紆余曲折ありましたが、最終的な仕組みをまとめたいと思います。

①判定用のデータをベクトルで保持
今までは壁データを線分の集まりとして処理していましたが、前述の振動はこれが原因です。そう、線分だと凸角の繋ぎ目での判定が2回行われ、「押し返しすぎ」により振動するのです。ではどうするか?繋ぎ目では片方の線分だけを処理すればよいのです。ただ片方といっても線分自体には向きはありませんので、方向を数値的に表現するために壁データはベクトルの集まりとして処理することにしました。

②直線として処理するか点として処理するか
壁とキャラなら直線と円として判定できそうです。ただし壁には長さがありますので、直線としては当たっていてもキャラが壁の真横にいなければ当たっているとは言い切れません。また壁の横にいない時も、繋ぎ目が凸角なら端点で当たる場合があります。このためまずは「キャラが壁の横にいるかいないか」を判定して「壁の面で判定するか端で判定するか」の場合分けをします。これは内積で計算できます(マルペケ様の受け売り)。

③(面)キャラは壁に接近しつつあるのか離れつつあるのか
今は壁に当たっているとしても、静止している場合や離れようとしている場合は処理する必要ありません。この判定は相対速度と法線の外積のy成分の符号を見ればわかります(言い忘れてましたがこの当たり判定は全てxz平面で行っています)。これは処理の高速化になるだけでなく、凹角で挟まるのを防止する効果があります。これがないと、一方の壁が与えた押し返しに反応してもう一方の壁が「吸い付け」をしてしまうことがあり、凹角で滑らかに壁ズリできません。ちなみにもちろん②で端を判定することになった場合、それは角だとしても凸角であり凹角なはずはありませんので、この判定は省略できます。

③(端)隣の辺の判定範囲に入っていないか
端を判定する場合は別の問題が発生します。隣の壁の面で判定できるのにこちらでも判定をしてしまうと、同じ接触点で2回判定されることになりやっぱり振動します。というわけで予め判定データには隣の壁のデータを入れておいて、②と同じように「キャラが隣の壁の横にいるかいないか」を判定して偽のときのみ処理を続けます。

④線分と点の距離の測定
ここに来てようやくキャラと壁の距離を計算します。面の場合はキャラの中心から直線への垂線の長さを、端点の場合はキャラの中心と端点の距離になります。やっぱりこれもマルペケ様を参考にさせて頂きました。ちなみにこんなものに平方根を使うのは無駄でしかありませんので、計算に2乗が入る場合は2乗距離のまま使いましょう。

⑤時間を巻き戻す必要があるかどうか
④での結果がキャラの半径より小さければキャラは壁に接触していることになります。ただし適当な閾値を設定しておいて、一定以上めり込んでいる場合は時間を戻す要求をし、接触とみなせる程度しかめり込んでいない場合は処理を続けます。時間を戻す要求を返り値で行うと、returnで無駄な処理を一気に飛ばせるので便利です。

⑥押し返しを実行する
遂に当たり判定の本編です。⑤をクリアしているということは今「ピッタリ接触している」はずですから、あとはキャラの移動速度の法線成分を打ち消すベクトルを求めるだけです。面の場合は相対速度と法線(正規化)の内積、端点の場合は相対速度と半径(正規化)の内積になります。凹角などで複数の打ち消しベクトルが同時に発生することがあるので、打ち消しベクトルは一旦変数に加算していって後で一気に打ち消すと、判定順による誤差がなくなります。

とまあプログラミングって数学っぽいところありますよね。でも数学と決定的に違うところがある。数学は理論的に同値ならそれらは全て「正しい」ですが、プログラミングでは適切な演算結果が得られても遅ければ「間違い」であり、逆に少々値がずれても要求仕様を満たせば「正しい」のです(そもそもデジタルコンピュータである以上、どんなに頑張っても値は離散的ですしね)。理学と工学の志向・思考の違いを感じます。では。
関連記事

[2014/09/19 13:08] | 不死女 -Immortal girl-
|
コメント:
この記事へのコメント:
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。