【ゲーム制作】三角関数(sin・cos)をゲームで使う方法|円運動・角度から移動方向を出す

ゲーム制作

今回は、ゲーム制作でよく出てくる「三角関数(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; を毎フレーム行えば移動になります(ゲームループの記事もどうぞ)。

実践例:敵を円運動させる

角度を少しずつ増やしながら cossin を使うと、中心のまわりをぐるぐる回る動きになります。

// メンバ変数として持っておく
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 を出す」ところから試してみてください。

関連記事