2015年9月3日木曜日

「ゲームを動かす数学・物理」の感想

以前紹介した「ゲームを動かす技術と発想」を書かれた堂前さんが,
「ゲームを動かす数学・物理」という本を出版されました.

内容としては,ゲーム開発で用いる,ということを前提とした数学や物理に関する解説で,
例がゲーム開発で実際に遭遇するような内容になっているため,ゲーム開発をするのであれば,
参考になると思います.

抽象的な説明ではなく,具体的な例を通しての説明が多く,図も多くて分かりやすい内容になっています.
あくまでも基礎的な内容なので,その辺りは理解している,という人には物足りない内容になっているかもしれません.
しかし,そのことを他の人に説明したりする際には使える内容だと思うので,理解している,という人も買って損はないと思います.

また,いくつもあるコラムも,実際のトラブルだったりゲーム開発に関係する内容だったりがあり,読んでいて面白いです.

最近は,大学からゲーム開発会社に就職する人も増えていますが,大学でゲーム開発に関係することをあまり学んでいなかった,
という人であれば,この本は足掛かりとして役立つと思います.

新人教育を担当することになった人には,新人に教える際のネタとして参考になると思います.

数学が苦手だと思っているゲーム開発者も読んでみると良いかもしれません.

以下は,各章を読んだ上での目次よりは詳しめ位の内容と感想です.

第1章 整数

メモリがバイト,そしてビットから構成されているという話から始まり,2進数,16進数,2の補数,とコンピュータが整数値を扱う上での基礎知識が解説されています.

数学ガールという本に,「例示は理解の試金石」,という言葉が良く登場します.例を通すことで,理解が深まります.
この章では,コンピュータが扱う整数値がビット単位でどうなっているのか,
図や表を使っての具体的な例がいくつもあり,抽象的な説明をされるよりも分かりやすいと思います.

また,第1章11節には,符号付き整数と符合無し整数の変数に,正の整数値と負の整数値を代入した場合どうなるか,ということが詳しく説明しています.
この例は,コンピュータが扱うのはあくまでもビットであり,その結果が正の整数値なのか負の整数値なのかは解釈次第だ,ということを理解するきっかけになるでしょう.

第2章 小数

コンピュータで小数を表すための仕組みとして,固定小数と浮動小数の仕組みが紹介されています.

固定小数,浮動小数どちらについても,具体的な値とビット列の図を用いながら,どういう仕組みで小数を表現しているのか,四則演算はどうなるのか,などの解説があります.
また,第2章6節では浮動小数での桁落ちと情報落ちという2種類の誤差についての説明も,ビット列による説明が分かりやすいです.
最後の第2章7節にある整数から浮動小数への変換時にデータが変わってしまう場合がある,という例は是非知っておくべきでしょう.

第3章 演算

この章では,基本的な四則演算,論理演算,ビットシフトについて解説しています.
論理演算やビットシフトについては,ゲームではお馴染みのフラグ管理での例があり,単純にどういう演算なのかを説明されるだけよりも頭に残る内容になっていると思います.

第4章 2次元

この章では,2次元座標と2次元ベクトルについて解説しています.

ここで重要なのが,「座標」と「ベクトル」をちゃんと区別している,ということです.
座標もベクトルも同じものとしてしまっている解説などもありますが,この本ではちゃんと区別しています.

このことを理解していないために数式を間違っていた,ということがあった気がするんですが,具体的な内容が思い出せないのが悔しいところです.

第5章 角度


この章では,角度から始まり,三角関数(角度から辺の比を返す関数),プログラムで三角関数を使う場合に気を付けるべき弧度法,三角関数の逆関数(辺の比から角度を返す関数),
ベクトルの内積について解説しています.

コラムになっている角度の正規化という話は,3Dを扱うならどこかでぶつかる可能性がある問題なので,是非目を通したい内容になっています.

また,三角関数の逆関数の使い道について,その関数が返す値の範囲にも言及し,非常に細かくどういうことに使えるのか,説明しています.
こちらも知っていて損は無い内容です.

最後のベクトルの内積についても,ゲーム開発で実際にどういう場合に使われるのか,どういう注意点があるのか,と具体的な話があります.
単なる内積の説明をされるよりもずっと興味を持てる気がします.

さらっと書いていて読み飛ばしそうですが,Visual StudioでM_PI(円周率を表すマクロ)を利用するには,_USE_MATH_DEFINESを定義しておく必要があることもしっかりと書いています.
意外とこのマクロが使えなくてビルドが通らない,というトラップにひっかかる人はいる気がします.

第6章 時間

この章は,ゲームにおける時間,フレームの概念の解説に始まり,処理時間が掛かりすぎた場合,つまり処理落ちに対してどう対処するのか,
ということで,いくつかの対策方法について細かく解説し,そのメリットデメリットが述べられています.

コラムには,サウンドの処理落ちについて語られています.実際,目には見えないけれど,サウンドのズレというのは意外と気づくものです.
音が鳴ることが予想できるモーションに合わせて音を鳴らしていると,処理落ちしたときにズレに気づいたりします.
何とか対策できないか,と言われることもありますが,そういう時はたいてい根本的に処理を軽くするしかなかったりします.

処理落ち対策として紹介されているもののなかで,自分は前フレームとの時間の差分を利用した方法をよく利用していますが,
差分を考慮済みの値に更に差分を考慮した計算をする,など注意しないと結局おかしなことになったりします.

そういえば,ネットワークを利用するゲームだと,光は遅い,なんて話もありますね.光は1秒間に地球を七周半するので,
地球の裏側にデータを送信しようとすると,60FPSなら8フレームほど,30FPSなら4フレームほどの時間がかかってしまいます.
光は物理的に一番速いので,本当に世界中で通信をしようとすると大変だというか,リアルタイム性は実現不可能だということですね.

この章に書いてある内容は,今時の3Dのゲームを作る上では必須の知識ですね.

第7章 運動


この章では,速度,加速度,等加速度運動やゲーム内でのメートルや秒などの単位についての解説があり,
摩擦,重力や跳ね返りなどにも言及しています.

特に,ジャンプに関しては,レベルデザインなども考慮した場合に,加速度や初速などをどう扱うか,
細かく解説してあるので,そういった動きを扱うのであれば目を通しておきたい内容になっています.

第8章 3次元


この章では,3次元ベクトルとその演算,平面,外積について解説しています.
特に,カメラが映す範囲(視錐台)に入っているかの計算をする例を通して,立体を構成する平面,その平面からの距離,平面の表側裏側を判定するための法線,その法線を求めるための方法としての外積,それぞれの計算方法について詳しく説明しています.

第9章 マトリクス


この章では,行列とその演算,ベクトルや座標との関係が解説されています.

行列関係はややこしいこともあってか,基本的な演算と,3Dで良く使う平行移動,回転,拡縮を表す行列や,逆行列の説明以外は使い方を説明してはいるけれど,詳細には踏み込んでいません.

ただ,最近はゲームエンジンなどでそういった演算については用意してあり,自前で行列の計算を実装する必要はあまりないので,何に使うかさえ知っていれば大抵は良いのかな,という気もします.

第10章 衝突


この章では,衝突判定に必要な処理と,高速化のための工夫について解説しています.

このあたりは数式と例だけよりも実装も見た方が良い,ということなのか,結構実装による説明が充実しています.

第11章 乱数

最後は,乱数について解説しています.ここでは,乱数の生成方法よりも,乱数の扱い方が中心になっています.

ゲームで乱数を使う場合,その再現性が問題になることがあります.本ではレースゲームのリプレイでAIが乱数で
動いていたら,という例で説明しています.

実際,新人がゲームを作る際に乱数を使おうとしたりするんですが,デバッグのし辛さなんかを考慮していなかったりするので,
どういう時に乱数が使えて,どういう場合には使わない方が良いか,使う場合には何を注意したら良いのか,というのは
しっかりと知っておくと良いと思います.

0 件のコメント:

コメントを投稿