2016年3月25日(金)、堂前嘉樹氏を講師とするセミナー「CGデザイナーのための数学講座 第1回 三角関数って結局何?」が、ボーンデジタルの主催で開催された。本セミナーは、「高校で数学を学びはしたが、その後の仕事や生活では使う機会がなく、今となってはほとんど覚えていない」というCGデザイナーを主な対象としており、数学とCGの関わりを全4回で解説する構成となっている。ここでは第1回で解説された三角関数の基礎と、CG制作への応用を紹介しよう。

記事の目次

    ※本記事は、『CGWORLD Entry』vol.16(2016年7月発行号)掲載の「数学も道具の1つと考え、慣れ親しもう CGデザイナーのための数学講座」を再編集したものです。

    堂前嘉樹氏(代表取締役) 株式会社ロジカルビート

    1998年から現在までゲーム開発に従事。2003年に入社したナムコ(現バンダイナムコスタジオ)では 『僕の私の塊魂』『鉄拳タッグトーナメント2』などの開発に携わる。2014年に独立。『いけにえと雪のセツナ』スクウェア・エニックス)ではグラフィックプログラムを担当。著書に『ゲームを動かす技術と発想』『ゲームを動かす数学・物理』(共にSBクリエイティブ)がある。
    logicalbeat.jp

    『ゲームを動かす数学・物理』(SBクリエイティブ刊)

    ゲームづくりに必要十分な数学と物理の知識を最短ルートで伝授!コンピュータでの数字のしくみからプログラムならではの加算や乗算、3Dのベクトル、マトリクス、そして物理や乱数などを、プログラムを交えながらサポート!
    www.sbcr.jp/products/4797376999.html

    使える道具が増えれば、問題の解決方法も増えていく

    セミナーの冒頭、堂前氏は数学を「道具の1つ」だと解説した。「ご承知の通り、CG映像やゲームなどのコンテンツを組み上げるまでに、皆さんは様々な道具を使います。その数ある道具の中の1つに数学も含まれるのです」。例えば、家を組み上げるまでには、釘やカンナ、ノコギリなど、様々な道具を使う。しかし、家が完成すれば釘は目立たなくなり、カンナやノコギリは不要となる。同じように、CG映像やゲームが完成すれば数学も目立たなくなるが、制作時には必要不可欠の道具なのだという。

    「使える道具が増えれば、ある問題に取り組んだときの解決方法も増えていきます。正攻法で取り組んで上手くいかないとき、道具を変えてまったくちがう方法で挑んでみたら、あっさり解けたという経験がありませんか?このセミナーでは、勉強としての数学ではなく、道具としての数学をご紹介します。皆さんの普段の道具の中に、ぜひ数学も加えていただければ幸いです」。数学は道具であると考え、CG制作の中で実際に使い、慣れ親しんでいくことが大切だと堂前氏は続けた。「習うより慣れろの言葉通り、慣れていくうちに理解が深まり、上手な使い方ができるようになります」。

    前述の通り、第1回では三角関数の使い方が紹介された。端的に言うと、三角関数とは角度の関数であり、オブジェクト自体の回転や、オブジェクト同士の相対的な位置関係の把握に使う。まずはsin・cos・tanがどういうものかを理解し、次にそれらを使って角度を算出してみると良いだろう。

    三角関数を理解するための3Step

    ここからは、三角関数の基礎であるsin・cos・tanと、CG制作への応用を見ていこう。

    Step01:そもそも、三角関数とは何か?

    三角関数では、sin(サイン)・cos(コサイン)・tan(タンジェント)という3つの記号を使う。三角形の角の1つが直角(直角三角形)の場合、sin・cos・tanは【A】の公式が成り立つ。この公式が三角関数の基礎だ。なお、前述の通り三角関数は角度の関数なので、たとえ3つの辺の長さが変化しても、3つの角度が同じであればsinθ・cosθ・tanθの値は変化しない。

    角度は0°から始まり、360°を越えると0°に戻る。すなわち、0°~360°でループされる。【B】はsinθとcosθの値の変化をグラフ化したものだ。このような波形のことを正弦波とよぶ。cosの波形を90°ずらすとsinと同一になるため、この2つの性質は同一と見なされている。

    なお、0°~360°の角度表記方法のことをデグリー表記とよび、デザイナーが使うソフトやツールで使用されている。一方、プログラム内部では180°=π(パイ)とするラジアン表記の使用が基本となっている。この場合、例えば90°=π/2と記す。

    ▲【A】三角関数の基礎である、sin・cos・tanの公式。三角形の大きさが変わっても、形(3つの角度)が同じであれば、sinθ・cosθ・tanθの値は変化しない/【B】sin・cosのグラフ。例えばsin45°=0.707106...、sin90°= 1、cos45°=0.707106...、cos90°=0である。(tanのグラフは本記事では割愛する)

    Step02:三角関数を回転に応用する

    CGのオブジェクトは座標の集合によって定義される。基本的に、2次元CGならx軸・y軸の直交座標系によって、3次元CGならx軸・y軸・z軸の直交座標系によって示される。【C】は2次元の直交座標系を使って四角形を定義したものだ。このように軸どうしは直交している(直角に交わっている)ため、座標の値を三角関数によって算出できる。

    【C】の場合は座標の原点と右上点を結んだ斜辺の長さが1のため、右上点の座標は(cos35°,sin35°)となる。これを+20°回転させた場合、右上点の座標は(cos55°, sin55°)となる【D】。つまり、θに該当する角度の増減によって座標の回転を制御できるというわけだ。

    なお、3次元CGの場合はこの計算にz軸の情報が追加される。前述の2次元CG同様、3次元CGの回転もsinとcosを使って制御できるが、効率的な方法とは言い難く、コンピュータの負荷が大きくなってしまう。そのため多くの3DCGソフトや各種ツールでは、【E】のように数字を縦に4個、横に4個並べた行列(マトリクス)の使用が一般的となっている。この行列の中にもsin・cosが使われていることに注目してほしい。

    ▲【C・D】斜辺の長さを1にすれば、座標の回転を三角関数によって制御できる/【E】3次元直交座標系を構成するx軸・y軸・z軸における回転を制御するための、3種類の行列(マトリクス)

    Step03:三角関数をライティングに応用する

    続いて、三角関数のライティングへの応用を紹介しよう。多くの場合、3DCGモデルはポリゴンとよばれる多角形の面の集合で構成されている。各ポリゴンと光源の位置関係がわかれば、各ポリゴンの明るさを算出できる。例えば、あるポリゴンが光源の方向を向いていれば、そのポリゴンは明るくなる。逆に、光源の方向を向いていなければ暗くなる。これがライティングの基本的な仕組みだ。このとき使うのが、内積と呼ばれる下記の公式だ。

    内積=V0・V1=(x0×x1)+(y0×y1)

    内積は2つのベクトル間の開き具合【F】を算出するための公式で、V0とV1の長さが1の場合には内積=cosθとなる。例えばポリゴンの法線と、光源から発する光との角度が0°なら内積(cos0°) は1、45°なら内積(cos45°)は約0.7、90°なら内積(cos90°)は0となる【B】【G】。つまり内積の値が1の場合にポリゴンを最も明るく設定し、0以下の場合に最も暗く設定することで、処理負荷の低いライティングの仕組みを実現できるというわけだ。

    ▲【F】内積はベクトルV0とベクトルV1間の開き具合を算出するための公式だ/【G】法線(ポリゴン面から垂直に伸びる線)と光源から発する光のなす角度をもとに内積(cosθ)を割り出し、ライティングに応用する。90°~270°の間は値が0以下となるため(【B】のグラフ参照)、最も暗く設定する

    TEXT_尾形美幸(CGWORLD)