今回は、ゲーム制作でよく出てくる「三角関数(sin・cos)の使い方」について解説していきます。
「sinとcosって、ゲームで何に使うの?」
「角度から移動方向を出したい…」
「敵を円運動させたいけど書き方が分からない」
こんな疑問はありませんか?
学校で習った三角関数は「何に使うの?」と思いがちですが、ゲームでは角度から移動方向を出す、敵をぐるぐる回す、ふわふわ上下させるなど、出番がとても多い道具です。
この記事を読み終えると、あなたはsin・cosのゲームでの使いどころ・円運動の書き方・角度の単位(ラジアン)・初心者がハマりやすいミスをしっかり理解できると思いますので、ぜひ最後まで読んでいただけると嬉しいです。
ゲームでの三角関数のイメージ
難しく考えなくて大丈夫です。ゲームで使うときのイメージはこれだけです。
cos(角度)… 横(X)方向の割合sin(角度)… 縦(Y)方向の割合
つまり「角度を渡すと、その向きのXとYを教えてくれる関数」です。角度 → 移動方向の変換だと覚えると、一気に使いやすくなります。
角度から移動方向を出す
「30度の方向に、速さ5で進む」を書いてみます。C++の std::sin / std::cos はラジアンで角度を受け取るので、度からの変換が必要です。
#include <iostream>
#include <cmath>
int main() {
const double PI = 3.14159265358979;
double degree = 30.0; // 進みたい角度(度)
double radian = degree * PI / 180.0; // ラジアンに変換
double speed = 5.0;
double vx = std::cos(radian) * speed; // X方向の速度
double vy = std::sin(radian) * speed; // Y方向の速度
std::cout << "vx = " << vx << ", vy = " << vy << "n";
return 0;
}vx = 4.33013, vy = 2.5
これで、弾を好きな角度に飛ばしたり、敵をプレイヤーの方向へ進ませたりできます。x += vx; y += vy; を毎フレーム行えば移動になります(ゲームループの記事もどうぞ)。
実践例:敵を円運動させる
角度を少しずつ増やしながら cos と sin を使うと、中心のまわりをぐるぐる回る動きになります。
// メンバ変数として持っておく
double angle = 0.0; // 現在の角度(ラジアン)
double radius = 100.0; // 半径
double centerX = 320.0, centerY = 240.0;
void Update() {
angle += 0.05; // 毎フレーム少し回す
double x = centerX + std::cos(angle) * radius;
double y = centerY + std::sin(angle) * radius;
// x, y に敵を描画すれば円運動になる
}sin だけを使えばふわふわ上下する動きにもなります。アイテムを浮かせる演出などによく使う小技です。
【重要】私が実際に三角関数で困った体験談
個人開発で弾を角度指定で飛ばそうとしたとき、std::cos(30) と度のまま渡してしまい、弾がまったく違う方向に飛んでいくという不具合にハマりました。
原因は、std::cos が受け取るのはラジアンだったこと。degree * PI / 180.0 で変換したら、ピタッと狙った向きに飛ぶようになりました。さらに、画面のY軸は下が正なので、上に飛ばしたいときは sin の符号を反転させる必要がある点にも注意です。
三角関数使用時のよくある失敗例と対処法
①度とラジアンの取り違え
体験談のとおり、一番多いミスです。degree * PI / 180.0 で必ず変換しましょう。
②Y軸の向きを忘れる
画面座標は下がプラスのことが多く、数学のグラフとは上下が逆です。上向きにしたいなら -sin のように符号を調整します。
③angleを増やし続けて値が大きくなる
円運動で angle を増やし続けても動きは正しいですが、値が際限なく増えます。気になるなら 2 * PI を超えたら引いて一周ぶんに戻すと安心です。
注意点
std::sin/std::cosは<cmath>をインクルードして使う- 角度の単位はラジアン(度を渡さない)
- 画面のY軸の向きに合わせて符号を調整する
まとめ
cosはX、sinはY。角度から移動方向を出す道具- 角度を少しずつ増やせば円運動になる
- 単位はラジアン。
degree * PI / 180.0で変換 - 画面のY軸は下が正。必要なら符号を反転する
三角関数が使えると、弾の発射・敵の円運動・ふわふわ演出と、表現の幅が一気に広がります。まずは「角度から vx・vy を出す」ところから試してみてください。


