明日への断片

ゲーム制作やプログラミング関する記事を中心に更新していこうと思います。

8欠片目:ゲーム制作に便利な数学関数~sin,cos編~

 こんにちは!冒頭の下らない自己紹介のネタが切れてきて困っているvoidです。
最近、本を読み始めました。タイトルは「オズの魔法使い」です。有名な童話ですね。まだ読み切ってないのですが、なかなかワクワクできて面白いと感じています。余裕が出来たらお勧めの本とかも紹介してみようかなぁなどと思いつつ本題へ!

サインコサインとかいう呪文

 サイン,コサイン,タンジェント。中学や高校で多くの人が数学の時間に習ったと思われます。そしてまた、多くの人がこう思ったのではないでしょうか。

「サインコサインなんていつ使うん?」

A:ゲーム制作で使います。
※もちろん、ゲーム制作以外の場所でも使われています
※今回は便宜上タンジェントさんの出番はございません

サイン,コサインを計算する関数

オススメ度★★★★

double sin(double x);  /*実数(double)型のサインを計算*/

double cos(double x);  /*実数(double)型のコサインを計算*/
機能 与えられた角度x(ラジアン値)のサイン値,コサイン値を返す

待って、そもそもサイン,コサインって何だっけ?

 ざっくりいうと、です。(ざっくりしすぎ)

図でわかる!サイン,コサイン

ここに、ある角度θ(シータ)が存在します。(パズーじゃないよ)
f:id:yasu-game-void:20170216223934j:plain

そこに、長さ1の辺を追加します。
f:id:yasu-game-void:20170216224156j:plain

この辺を斜辺とし、θを角度に持つ直角三角形は、
f:id:yasu-game-void:20170216224949j:plain

必ず、こんな形になると思います。

このとき、

「yは1(斜辺)の何倍か」を表したものがsinθ

「xは1(斜辺)の何倍か」を表したものがcosθ

即ち、

1 * sin(θ) == y;
1 * cos(θ) == x;

というわけです。

いつ使うの?

 シューティングゲーム等で、自機を斜めに動かしたい!弾を相手のいる方向に飛ばしたい!というときによく使われます。
プログラムで画像を表示する際にはx座標とy座標を指定して描画します。つまり斜めに動かすときは両方の値を計算する必要があります。

例えば、右キーを押したとき、右に1進む。上キーを押したときに上に1進むという処理で右上に進もうとすると、斜めの移動量は、√2という値になってしまい、不自然な動きになります。

 そこで!斜め移動をするときは、右に1*cos(π/4)進み、上に1*sin(π/4)進むことで、斜めの移動量が1になり、動きがとても滑らかになります。

π/4は45度のラジアン

いかがだったでしょうか

 あまり上手に説明できていなかった気もしますが、sin(),cos()を上手く使って計算すると、ゲームの表現の幅が広がると思うので、自分もどんどん使いこなせるようになっていきたいと思います!


本日はこの辺で。ではまた!