私は専門学校でゲームプログラミングを教えたりもしてるのですが、その最初の授業で必ず学生に伝えることがあります。ゲームプログラマーとして稼ぎたかったら「数学」を学べと。これを言うとほとんどの生徒は苦笑いします。分かっちゃいるけど、苦手なんだという表情です。とはいえ、数学を道具として使えるかどうかで、特にゲームのプログラミングでは、随分と効率が変わります。

ゼーンコクの女子高生のみなさ~ん、数学を学ぶとすぐお金儲けができるんだよ~、ホレ、ポチッと
(イラスト:闇雲)

 別に数学ができなくてもプログラムは組めます。実際、数学の知識が乏しくても、見事にゲームを作り上げるプログラマーもいます。しかし、それは徹底的にプログラミングの練習をしている、もしくはプログラミングの才能があるからです。その境地に達する訓練を積むのもアリですが、プログラミングよりもはるかに長い歴史があり、多くの先人たちが工夫を重ねて洗練させてきたテクニック集としての「数学」を使って楽をしないのは損だと私は思います。

 例えば、画面上の一点を中心にして回転する敵キャラを作りたいとします。画面の更新は60fps(フレーム/秒)。 fpsは1秒間に何コマのアニメーション更新を行うかの単位で、この数値が大きいほど動きは滑らかになります。一方でプログラミングやデータ作成は大変になります。

 さて、ここで「回転といえば三角関数」とすぐに思い付ければ簡単です。三角関数は、角度を x, y で表される座標に変換できる関数ですから、角度の数値を少しずつ変化させれば、敵キャラを配置すべき座標がすぐ計算できます。

 もちろん三角関数を知らなくても同じ動きのプログラミングは可能です。例えば1秒間で1周するような動きにしたいなら、60コマ分の敵キャラの座標をあらかじめ決めておいて、これに沿って画像を描画する位置を指定すれば動かせます。

 しかし、これはいかにも大変そうです。例えば、1秒間で1周を、3秒で1周に変更したい場合など、全てのコマにおける敵キャラの位置を設定し直さなければなりません。三角関数を使う方法なら、角度を変化させる速度を変えるだけで、あとはコンピュータが自動で計算してくれます。

 もちろん、三角関数をコンピュータに計算させるプログラムを最初から組み上げるのは結構大変です。しかし、三角関数はとても良く使われる便利な関数なので、ほとんどすべて全てのSDK (ソフトウエア開発キット、 プログラミングに良く使われる部品を集めたもの)に装備されています。現実のプログラミングではこれを利用するだけで楽ちんです。

 3Dグラフィックスの場合、三角関数を使ってX-Y-Z各軸の回転を計算します。これを行列の形にまとめた「回転行列」は、ゲームのキャラクターやカメラの制御に必須の存在です。行列は三角関数と並んで嫌われ者のようですが、実は多くの方程式を書き連ねる手間を省き、機械的な数式操作を簡単にできます。そのための書き方なのです。

 単純な形式なのでハードウエア化も容易で、その典型がGPU(画像処理プロセッサ)です。ゲームなどのグラフィックス処理を高速化、美麗化するためのLSIですが、その正体はひたすら行列の計算を高速に繰り返すだけの単純な機能の計算機です。ですから、これを使いこなすには、行列について少しだけ知っていた方が圧倒的に有利です。

 行列に関連して「ベクトル」という考え方も重要です。ベクトルは、複数の数の組です。これを使うと座標をシンプルに表現できます。また、ベクトルの値を原点からの向きとして解釈もできます。これにより速度や加速度といった動きを表現するための値を簡単に扱えます。また、ベクトル同士の角度は、内積という演算で求められます。

 例えば、一つのベクトルが光の向き、もう一つのベクトルがオブジェクトを構成する面の傾きとして、これら同士の角度を計算すると、その面の明るさが求められます。これが3Dグラフックスにおけるいわゆる「レンダリング」の基礎原理です。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら