学校で習った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軸は下が正。必要なら符号を反転する
角度を少しずつ増やせば、円運動になります。単位はラジアンなので、度数からはdegree * PI / 180.0で変換します。画面のY軸は下が正になるので、必要なら符号を反転してください。


