数学を放棄したエンジニアの3Dプログラミングさんすう入門 第一回 sin、cosってなんぞや
はじめに
この記事は高校数学を放棄したエンジニアが、ウェブ系エンジニアになって安心していたところに、突如3Dプログラミング(Unity)案件が降ってきて、悪戦苦闘しながら3Dプログラミングのためのさんすうを勉強した内容のまとめです。
目標
Unityにおいて勉強する必要がない内容については省いていきます。例えばベクトルの演算や、平行移動などはUnityの機能で実現できるので省きます。
ニコニ立体のカメラ や メタセコイアのカメラ を思い浮かべてください。双方とも、中心座標から一定の距離を保ち、円を描くように回転する動きをしています。この回転座標を計算できるようになることが本連載の目標となります。
Unityに触ったことがある方なら、RotateAroundを使えば実現できると考えるかもしれません。GameObject同士の回転であればRotateAroundを使えますが、座標(Vector3)同士の演算はできません。もしかしたら座標同士の演算をしなければならなくなることがあるかもしれません。わたしです(^q^)
そのような状況に対応できるようになるための3Dプログラミングさんすう入門になります。
注意
筆者は高校数学を放棄してきたので、数学的に誤った説明をする可能性があります。
SinとCosについて
数学アレルギーな私はこのワードを聞いただけで発狂しました。体中に蕁麻疹ができて泡を吹いて倒れそうな気分でした。でもまぁなんとなく理解したら大したことない奴らでした。
こいつらって何なの?
プログラミングで例えれば、ただのメソッドみたいなものです。きっと実装があればこんな感じです。
public float Sin(float radian) { /* Sinの計算がきっとこの辺にある。 */ return sin; } public float Cos(float radian) { /* Cosのがきっとこの辺にある。 */ return cos; }
なにも怖くありません。第一引数に角度を入力すれば、結果が計算されて帰ってくるのです。エンジニアはSinメソッドと、Cosメソッドの実装を知らなくても使えるのです!
一体なんに使うの?
3Dプログラミングでは SinとCosが返す値の性質を利用します。SinとCosが返す値をグラフにしてみました。
角度が0度の時に Cos(0)=1、Sin(0)=0になります。角度が90度で Cos(90)=0、Sin(90)=1、180度ならCos(180)=-1、Sin(180)=0、270度ならCos(270)=0、Sin(270)=-1。なにか見えてきませんか?
2次元座標のXにCosを、YにSinを当てはめてみます。new Vector2(Cos(radian), Sin(radian)) ってとこですね。
なんと円になります。CosとSinが返す値を使うと半径が1の円を書けるのです!
もうちょっと補足
こんなイメージです。ちなみに半径が2の円を書きたければ cosとsinを2倍にし、半径が0.5の円を書きたければ0.5倍すれば書くことができます。
まとめ
CosとSinは単なるメソッドだ!中身の実装なんか知らなくても返す値の性質さえ知っていれば後はなんとかなる!(適当)