【ゲーム制作】三角関数(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軸は下が正。必要なら符号を反転する

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

関連記事