GDC 2日目(1) ゲーム開発者の為の物理

微妙に風邪をひいたのかずっと喉が痛くて咳をしてました。悪化しなければいいな…
そんな今日はtutorial「Physics for Game Developers」を聴講しました。
結論から言うと、最高に良かった。大収穫です。今までに学習してきた様々な断片的なコリジョンに関する知識が完全に総ざらいで整理され、分かりやすく説明されていて、頭の中がすごくすっきりしました。私の専門はコリジョンエンジンで、物理エンジンの方の知識はかなり弱い方だったのですが、このtutorialは概要の説明としても十分に分かりやすいもので、多分この辺りの知識を教科書などから拾い集めようと思ったらかなりの時間がかかったことは間違いないと思います。
動く物体同士のコリジョンに関する話で目からうろこだったのが、

  • 片方の物体の座標系で見た場合、動物体対静物体の問題に落とすことができる(*1)
  • 凸物体間のコリジョンCSO(Configuration Space Obstacle)と点の問題に落とすことができる(*2)

というそれなりに理解の簡単なテクニックから、

  • 動物体同士のコリジョンは、静止したCSOと動く点の衝突問題に落とすことが出来る

となり、これは言い換えると

  • 動物体同士のコリジョンは、CSOに対するレイキャスト問題に落とすことが出来る(*3)

になる、というくだりでした。tutorialを聞いていると、(*1)と(*2)の説明がなされて、私には(*1)はわりとなじみの無いテクニックだったのですが、これを聞いた瞬間に、もしやこれは(*3)につなげられるのではないか、と予想して配布資料をめくっていったら、本当にその話が載っていて感動しました。とちょっと自慢。じゃあCSOに対するレイキャストってどうやるのよていう話なんですが、そこは旨い事にGJK-Based RayCastという、サポート写像をサポートする任意の凸物体に対するレイキャスト手法が存在しており( http://www.dtecta.com/papers/jgt04raycast.pdf 参照 )、CSOもサポート写像をサポートするという事実から、CSOに対するレイキャストが実行できるわけなんですよ!!と一人興奮してしまったtutorialでした。まとめると

  • CSOはサポート写像をサポートする
  • GJK-Based RayCastというサポート写像をサポートする凸形状へのレイキャスト手法が存在する
  • よってCSOへのレイキャストが実行できる

という話です。
GJK-Based RayCastもテストですが既に実装してましたし、今日のtutorialでその辺りの知識の断片が一気に結合した感覚です。
CSOとかなんだよそれという人でコリジョンに興味のある人は是非「Collision Detection in Interactive 3d Environments」という書籍をごらんになってください。

Collision Detection in Interactive 3D Environments (Series in Interactive 3d Technology)

Collision Detection in Interactive 3D Environments (Series in Interactive 3d Technology)

凸形状の衝突計算に必要なCSOとか分離軸とかGJKアルゴリズムとかについてはこの本に載っており、tutorialでもこの本の著者 Gino Van Den Bergen さんが直接説明してくださっていました。私はこの本に大変感銘を受けたクチで、著者を直接見られるのをとても楽しみにしており、実際に顔を見られてとても嬉しかったです。ちなみに顔はスパイダーマン2に出てくる敵役のドクター・オクトパスにかなり似ていましたw
また、3D計算ではおなじみの浮動小数点誤差に対する問題についての説明もありました。私はこの辺りの知識があいまいだったのですがこれについても相当整理された形で情報を提供してくださっており、大変な栄養になりました。なんで浮動小数点の0除算が例外を出さないでInfやNaNを伝播させるのかについての合理的説明も目から鱗でした。「(同一性判定の許容値である)epsilonを適当に決めちゃいないか?」というくだりにはドキッとする人も沢山いらっしゃるのではないでしょうか?要はIEEE-754単精度浮動小数点の仕様から導出される正しい決め方をしたほうがいいよ、という話です。他にも、昔CEDECでやっていたワンダと巨像の講演での質疑応答で、広大な空間における地面とのコリジョン計算の抜け問題が説明されていましたが、それと同様の話も出ており、ひょっとしたらこのくらいの問題は既にぶつかっていて当然の話だったのかも知れませんが…。
後は物理エンジンの話も山ほど出てきました。これらに関しても、かなり分かった気になっていたのですが、いざ文章に書き下ろそうとすると矛盾の無い話を書くことができませんでしたorz。ということはあの場では理解できていなかったことになります。良く分かりませんが、最近は加速度ではなく速度ベースでconstraintsの解決をするのが主流らしいですね。
リンク先には2005,2006年のGDC資料が落ちている模様です。しばらくすると2007年のもダウンロードできるようになったりするのかな…。
http://www.gphysics.com/downloads/