ゲーム数学の習得：初級編

ゲームプログラムを行う上での数学の知識に関してのメモです。

ざっとですが、ゲームプログラムで使うのは四則演算意外だと「三角関数」、「微積」、「代数（行列、ベクトル）」といったところですかね。

とっかかりとして高校数学で上記の理解ができていない人は、なんでそれが必要なのかがわかっていないからだと思うんですよね。

なので興味を持ってもらうために、それぞれゲームにどんなふうに使われているのか、というところを書いていきます。
あとはとっかかりとして参考になるサイト、書籍も取り上げていきますー。

#■三角関数
sin、cos、tanです。
「三角関数」は、円の動きをするときに使います。円の動きはゲームだと重要ですよね？
2Dのあたり判定にも使用できます。どれくらい離れているかが三角関数を使うと分かります。

三角比とかあまり気にせず、sin、cos、を使うと円運動の数値を割り出すことができると思っておくと理解が早いかと思います。
https://thebookofshaders.com/05/?lan=jp

上記ページの「サインとコサイン」の説明部分のsin、cos、の動きをみるとイメージが付きやすいかと。
わかりにくいかもしれませんが、cosの値をx値に、sinの値をy値に入れると丸が書けるようになります！

#■代数（行列、ベクトル）
「代数（行列、ベクトル）」に関しては、行列はオブジェクトの回転などに使用します。
ベクトルは内積、外積の計算に使用します。内積はあたり判定に、外積はポリゴンの向き（外を無ていいるのか内を向いているのか）の判定に使用します。

ゲームで使用するのはほとんど代数なんですよね。
代数のみの勉強でもいいのですが、途中で「三角関数」を使う場面が多々出てきます。
なので先に「三角関数」は理解しておきましょう。

行列はわかりやすい資料が少ないのですが、個人的には下記の書籍をお勧めします！
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B00ZR7XVNO/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00ZR7XVNO&linkCode=as2&tag=fishheadpm0c-22&linkId=45a259b13652140704090bebaa48b758">マンガ　線形代数入門　はじめての人でも楽しく学べる (ブルーバックス)</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=fishheadpm0c-22&l=am2&o=9&a=B00ZR7XVNO" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

とりあえず最初の理解は一番簡単なもので、ということで私がいくつか見た中では一番簡単な説明だと思います！

#■微積
微分はAI系で使用するようですね。私はまだ出くわしたことがないですが。積分は変な形の面積を求めるのに使用しますが、こちらもあまりゲームでは使用しないように思います。

個人的に下記の書籍がわかりやすかったので、微積に関しては簡単な紹介まで。
<a target="_blank" href="https://www.amazon.co.jp/gp/product/453721581X/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=453721581X&linkCode=as2&tag=fishheadpm0c-22&linkId=6bcfc24fb99d903ad5ed1febee9b4b09">眠れなくなるほど面白い 図解 微分積分</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=fishheadpm0c-22&l=am2&o=9&a=453721581X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


#■効率よく勉強を始めるまでに

とまあ簡単に紹介してしまったので、実際まだわからないと思います。
なのでまずは下記の書籍を読むのをお勧めします！

<a target="_blank" href="https://www.amazon.co.jp/gp/product/4797370122/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797370122&linkCode=as2&tag=fishheadpm0c-22&linkId=db66b36fc7ef7a817e8f46d90186cd21">ゲームを動かす技術と発想</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=fishheadpm0c-22&l=am2&o=9&a=4797370122" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

こちらの書籍はゲームの中で使われている技術の説明している本となります。
難しい説明はあまりなく、概念や言葉の説明をしているものが多いのでざっと知識を得るのに非常に有効な本です。

細かいところの理解は置いておいて、こちらをざっと一回読んでから数学の勉強を始めると理解度がかなり変わってくると思います。
プログラマだけではなく、プランナーの方にもお勧めです！

私はゲームの数学を勉強始めるときに「ゲーム3D数学」を最初に読みましたが、正直内容がよく理解できませんでした。
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4873113776/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873113776&linkCode=as2&tag=fishheadpm0c-22&linkId=12e41750894afd3e036fc0cd214a608a">実例で学ぶゲーム3D数学</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=fishheadpm0c-22&l=am2&o=9&a=4873113776" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

デカルト座標のあたりはほかの人の書評だと冗長だと言われているのを見たことがあるのですが、個人的にはこういう説明をしてもらったことがなかったので非常によかったです。
ただ、割と難しい内容が多いのと、わからない人を置いていく傾向、あと細かいところで間違っていっぽいところがあるのでそこまでお勧めできません。

次に「ゲームプログラマ覚えておきたい技術」、を読んで実際のソースを見て何となく何をやっているのかが理解できました。
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4798021180/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798021180&linkCode=as2&tag=fishheadpm0c-22&linkId=ba16fe59e07ef403bd6922ec9e475ce5">ゲームプログラマになる前に覚えておきたい技術</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=fishheadpm0c-22&l=am2&o=9&a=4798021180" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

ただこちらの書籍少し古く、動かせる環境を作るのが難しいかと思います。
それでも他の書籍よりも「実際のプログラムでどう書くのか」、が一番載っている本です。プログラムから理解するほうがいい人にはお勧めですね。

「ゲームプログラミングC++」を読んで、最新技術として覚えておかないといけないことが何となくわかりました。
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4798157619/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798157619&linkCode=as2&tag=fishheadpm0c-22&linkId=0d91bed19709a4227432f3133539c4a8">ゲームプログラミングC++</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=fishheadpm0c-22&l=am2&o=9&a=4798157619" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

こちらの本はほかの本に比べて最近出版されているので、そういった面では安心です。ただグラフィックに関しての知識がないとそもそも何をやっているのかわからないかもですね。
あと使用している言語がC++なので、言語がわからない人には別の壁があるかもです。
最近は現場でもC#が優勢ですし。それでもC++はできたほうが、担当できる仕事の選択肢が広がるとはお思います。

それぞれ最初は何をやっているのかちゃんと理解できなかったのですが「ゲームを動かす技術と発想」をこの三冊の後に読んで何をやっているのかの理解が深まりました。

これ絶対逆に読んでいった方が良かったやつです！

その後私のブログで書評をした「ゲームアプリの数学」を読んだのですが、「ゲームを動かす技術と発想」を読んだ後だったので以前に読んだ書籍よりも理解ができましたね。
http://game-pm.com/46

まず「何をやっているか」がわからないと、頭に入ってこないですよね。

皆さんは同じ失敗をしない方がいいので「ゲームを動かす技術と発想」から読んでいきましょう。


#■最後に

私はあんまり頭がよくないというか、文章を読んで理解するということが苦手です。

ドキュメントを読んで理解できる人がいますがすごいなと思ます。そういう人はロジカルな思考能力が優れている傾向にあるかと思います。

私は実際のソースを読んだり、数値を変えてみた入りしているうちに理解していることの方が多いです。

そういうやり方はと効率が悪いという人がいるのですが、初動のスピード感は私のやり方の方が早いかと思います。

最終的に問題のないソースにするというところを考えると、ちゃんとドキュメントを読んで理解している人の方が早く確実にできているので直さなきゃとは思ってはいるのですが。

それでもこういう記事を読む人は、そもそも数学が苦手なんだと思うんですよね。

「やってもわからない」という場合は、「何をやっているのか」をちゃんと理解した後に、複数の説明にあたることをお勧めします。
あとは「ためしにサンプルプログラムを動かしてみる」というのも有効だと思います。

最初読んでいてもピンとこないものが別の書籍だとよくわかったり、2回目に読んだところで納得がいったりするのであきらめずに続けるのが重要だと思います。

私も道半ばだったりしますが、みなさんのゲーム数学の習得の助力になれたら幸いです。

#■ゲームプロマネのブログ
http://game-pm.com/

こちらはプログラム要素は少なく、ゲーム開発に関するあれやこれやを話しております。

そちらに興味がある方はぜひのぞいてみてくださいね！

上記記事に関してご意見ご要望がある方は私のtwitterまでお願いいたしますー