【Unity】AngleAxisとは?指定した軸と角度で回転させるメソッド

AngleAxisとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのAngleAxisってなに?」

「AngleAxisメソッドってどうやって使うの?」

というお悩みの方に向けた内容となっています。

Unityでは、オブジェクトの回転処理を作る際にAngleAxisメソッドというものが使われることがあります。

このAngleAxisとは、回転させる軸と角度を指定することで、その回転のQuaternionを作成することができるメソッドです。

そして、この作成したQuaternionをオブジェクトのrotationに加えることで、オブジェクトを回転させることができます。

そこで、このページでは、UnityのAngleAxisメソッドについて、どんなメソッドなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

AngleAxisとは?

まずは、AngleAxisメソッドがどういうものなのか紹介していきます。

指定した軸と角度で回転するQuaternionを作成するメソッド

AngleAxisメソッドとは、回転軸角度を指定することで、その回転におけるQuaternionを作成できるメソッドです。

Unityでは、オブジェクトの回転を表す際にQuaternion(四元数)という仕組みが使われていて、Quaternion構造体で全てのオブジェクトの向きや回転が管理されています。

AngleAxisは、このQuaternion構造体で定義されているメソッドで、回転させる際のとその軸に対して回転させたい角度を指定して使います。

ちなみに、AngleAxisメソッド自体は回転処理を行うわけではなく、その回転におけるQuaternionを作成することになります。

そのため、オブジェクトを回転させる場合は、AngleAxisメソッドで作成されたQuaternionを自身のTransformのrotation変数に掛け合わせることで、回転処理が行われるようになります。

特定の軸で回転させたい処理を作るのに使う

前述の通り、AngleAxisメソッドは軸を指定してQuaternionを作成することができるので、特定の軸の向きに対して回転処理を作りたい場合に使います。

例えば、ワールド座標におけるY軸を中心にオブジェクトを回転させるというような処理をAngleAxisメソッドで作ることができます。

他にも、オブジェクトが持つローカル座標における軸を使って回転を行う、といった処理をAngleAxisメソッドで作ることができるようになります。

AngleAxisの使い方

ここからは、AngleAxisメソッドの使い方について紹介していきます。

引数で回転軸と回転させたい角度を指定する

AngleAxisを使う際は、以下のように引数に回転させる軸回転させたい角度を指定することで、Quaternionを作成することができます。

AngleAxis(angle, axis);

angle:回転させたい角度(float型)
axis:回転させたい軸(Vector3型)

第1引数に、回転させたい角度float型で指定していきます。

そして、第2引数に、回転させたい軸Vector3型で指定していきます。

この回転させる軸を指定する際は、直接ベクトルを指定するだけでなく、以下の変数が使われることが多いです。

  • ワールド座標のX軸:Vector3.right
  • ワールド座標のY軸:Vector3.up
  • ワールド座標のZ軸:Vector3.forward
  • ローカル座標のX軸:transform.right
  • ローカル座標のY軸:transform.up
  • ローカル座標のZ軸:transform.forward

Y軸を中心にオブジェクトを回転させる処理

実際にUnityで、AngleAxisメソッドを使ってオブジェクトの回転処理を作ってみます。

ここでは、スペースキーを押したら以下のオブジェクトが、ワールド座標のY軸に対して回転する処理を作っていきます。

オブジェクトに対して、以下のスクリプトをアタッチしていきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Update()
    {
        // スペースキーを押した場合
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Quaternion rotation = Quaternion.AngleAxis(20f, Vector3.up);    // Y軸で20度回転させるQuaternionを作成
            transform.rotation = rotation * transform.rotation; // transform.rotationに左から掛け合わせる
        }
    }
}

スペースキーを押した際の10行目で、AngleAxisメソッドで回転させたいQuaternionを作成しています。

このAngleAxisメソッドの引数で、回転させる角度を20度、そして回転軸をワールド座標におけるY軸として「Vector3.up」で指定しています。

そして、この値を11行目で自身の「transform.rotation」の値に左から掛け合わせて、回転処理を行っています。

これでゲームを実行してみると、

Y軸である上方向を軸として、回転しているのが分かります。

オブジェクトの軸を使って滑らかに回転させる処理

今度は、オブジェクトのローカル座標の軸を使い、滑らかな回転処理を作ってみます。

ここでは、以下の赤色のオブジェクトを使って、ローカル座標のZ軸に対して回転する処理を作ってみます。

赤色のオブジェクトに対して、以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    Quaternion start;   // 最初のオブジェクトの回転
    Quaternion target;  // 目標となるオブジェクトの回転
    bool isRotation = false;    // 回転させるかどうかを判定する変数
    float time = 0; // 回転している時間を計測する変数

    void Update()
    {
        // スペースキーを押した場合
        if (Input.GetKeyDown(KeyCode.Space))
        {
            start = transform.rotation; // 現時点での回転を代入する
            target = Quaternion.AngleAxis(180f, transform.forward) * transform.rotation;    // 目標となる回転を作成する
            isRotation = true;  // 回転を開始する
        }

        if (isRotation)
        {
            time += Time.deltaTime;
            transform.rotation = Quaternion.Slerp(start, target, time / 4); // 4秒間かけて回転処理を行う

            // 4秒以上経過した場合
            if (time > 4)
            {
                isRotation = false; // 回転を停止する
                time = 0;   // 変数を初期化する
            }
        }
    }
}

スペースキーを押した場合の中の16行目で、AngleAxisメソッドを使って目標となるQuaternionを作成しています。

引数で、回転角度はオブジェクトを半回転させたいので180度、回転軸にはオブジェクトが持つローカル座標のZ軸方向を設定したいので、「transform.forward」で指定しています。

そして、23行目でSlerpメソッドを使って、滑らかに回転処理が行われるようにrotationの値に代入を行っています。

なお、スクリプトの中の「isRotation」の変数で回転中かどうかを判定し、「time」の変数で回転にかかる時間を計算して処理を作っています。

これでゲームを実行してみると、

スペースキーを押すと、ローカル座標のZ軸に対して滑らかな回転処理が行われるようになりました。

まとめ

このページでは、UnityのAngleAxisメソッドについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

AngleAxisメソッドとは、回転させる軸と回転角度を指定することで、その回転のQuaternionを作成できるメソッドです。

このAngleAxisを使うことで、オブジェクトを特定の軸に対して回転させるという処理を作ることができます。

ただし、AngleAxisはあくまでもQuaternionを作成するメソッドなので、オブジェクトに回転処理を行う場合は自身のrotationの値に掛け合わせる必要があります。

最後までお読みいただきまして、ありがとうございました!

コメント