プログラマーの吉岡直人です。実は私、大学は数学科の卒業です。とんでもない落ちこぼれのダメ学生で、先生方には迷惑をかけ通しでしたが、それでも数学の「美」に痺れたひとりです。それは、まるで神学か哲学のような世界。いわゆる「純粋数学」の世界でした。「無限とは何か?」「数とは何か?」「そもそも数学とは何か?」などすらも数学の対象でした。そこで得た衝撃や、視野の変化は私のその後の人生に非常に大きな影響を与えたと思います。

[画像のクリックで拡大表示]

 ですから、数学が金儲けの道具ばかりではないのは、私も良く理解しているつもりです。しかし、前回のコラム(「数学」はプログラマーで稼ぐイージールート)で述べた「数学は金儲けの道具である」という言い方を変えるつもりはありません。それはなぜか?より多くの若い世代の人たちに数学に興味を持ってもらうためです。

「数学が苦手」はだいたい三角関数のせい

 私は専門学校でゲームプログラミングを教える仕事もしているのですが、ご多聞にもれず数学に苦手意識を持つ学生さんが大勢います。どのあたりでつまずいたかを聞いてみると「三角関数」を挙げる人が多いのです。

 三角関数は「関数」ですが、具体的に計算する方法が良くわかりません。教科書でこれが登場する前は「関数」は、例えば「y=3x+1」のような形です。変数「x」に具体的な値を入れれば、「y」を具体的に計算できます。実際に計算できるのは安心感がありますよね。でも、三角関数の「sin」とか「cos」はどうやって計算したらいいかわからない。しかも、変数としては「θ (シータ)」などという見たこともない記号が出てくる。まあ、これでパニクるなと言う方が無茶ではないでしょうか。

 しかし、この「三角関数」はゲームのプログラミングで避けては通れません。キャラクターの腕を曲げる、カメラを回転させる、敵機がこちらを狙って動く、などなどビデオゲームを構成する重要な部分の数々に三角関数が使われるからです。だからこそ、ゲームプログラマーは数学を学ぶべきなのです。数学をちょっと学ぶだけで確実に稼げ、他のプログラマーより圧倒的に優位に立てるというお話は前回したとおりです。そこで今回は苦手な数学を得意にするとっておきの方法をお教えしたいと思います。

 先日、「全国自治体ゲームコラボレーションフォーラム」での登壇(関連記事:吉岡直人~岩手県はなぜポケモンGOを活用できる? 仕掛け人に聞いた)のために、盛岡に帰郷したついでに、地元のコンピュータ系専門学校「盛岡情報ビジネス専門学校)」(通称モリジョビ)で「実践ゲーム数学」と題した2時間の特別授業を行ってきました。対象は、同校でゲーム開発を学ぶ学生さんを中心に30名ほど。11月3日、文化の日で祝日であるにも関わらず熱心な方々が参加してくださいました。

 内容は、ゲームで良く使う数学のおさらいです。そんなに高度な数学ではありません。今回、取り上げたテーマは、以下の11テーマでした。

  • ベクトル
  • 当たり判定
  • アニメーション
  • 三角関数
  • 群れ/パーティクル
  • 物理
  • ノイズ
  • フラクタル
  • 可視化/シミュレーション
  • アルゴリズム
  • CG幾何

 テーマごとに数本の短いサンプルプログラムを見せてから、実際に動かしてみせるというだけの授業です。説明はプログラム1本あたりわずか1分ほどのライトニングです。プログラミング環境にはもともとはMITメディアラボが開発したビジュアル表現が得意な言語「プロセッシング(Processing)」を使いました。

初心者向けプログラミング言語としてProcessingがかなりイケてる、と私は以前から考えています。初心者向けとよく言われる「Scratch」よりも良い面もあります。プログラミングの「驚き」がたくさんあり、やってると楽しくなってくるところです。またもともと教育向けの言語なのでUIが整理されており、複雑じゃないのもお薦めです(2019年4月10日追記)

ゲームのプログラミングで「使える」数学だけピックアップ

 例えば、ある点と、円や球との「当たり判定」。例えば弾が敵キャラに当たったかどうかの判定(ものすごくよくありますよね?)などのために使いますが、「ピタゴラスの定理」(三平方の定理)が重要な役割を果たします。当たりを判定したい点と、対象の円や球の中心との距離の二乗は、ピタゴラスの定理で簡単に求められます。これと、円や球の半径の二乗を比較し、前者が後者以下であれば「当たり」と判定するわけです。

ピタゴラスの定理(三平方の定理)を使った当たり判定のプログラム
[画像のクリックで拡大表示]

 プロセッシングを使ったのでコードも以下のように簡単です。


float x, y, r;

void setup() {
  size(500, 500);
  x = y = 250;
  r = 100;
}

void draw() {
  background(255);
  float dx = mouseX - x;
  float dy = mouseY - y;
  if (dx*dx + dy*dy < r*r) {
    fill(255, 0, 0);
  } else {
    fill(0);
  }
  ellipse(x, y, 2*r, 2*r);
}

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

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