【Unity】eulerAnglesとは?オブジェクトの回転角度を取得できる変数

eulerAnglesとは? Unity

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

このページでは、

「eulerAnglesってなに?」

「eulerAnglesはどんな使い方をするの?」

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

eulerAnglesとは、オブジェクトの向きやQuaternion型の値から角度を取得したい場合に使う変数です。

Unityでは、オブジェクトの回転を表す場合に、Quaternionの仕組みが使われているため、そのままでは角度を取得することができません。

このeulerAnglesの変数を使うことで、Quaternionからオイラー角に変換して、角度を取得することができます。

そこで、このページでは、Unityでオイラー角を取得することができるeulerAnglesという変数について、どんな変数なのか、また使い方までをまとめていきます。

この記事を書いた人

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

eulerAnglesとは?

まずは、eulerAnglesがどういう変数なのかについて紹介していきます。

オブジェクトの角度(オイラー角)を取得できる変数

eulerAnglesとは、オブジェクトが回転している角度(オイラー角)を取得することができる変数です。

そもそもオイラー角というのは、3次元の空間においてX軸・Y軸・Z軸のそれぞれの軸を中心として、オブジェクトの回転を表す手法やその回転角度のことです。

Unityにオブジェクトを配置した際に、インスペクターウィンドウのTransformコンポーネントに表示されるrotationの数値がオイラー角となっていて、X軸・Y軸・Z軸に対してどのくらいの角度を回転させるかを決めることができます。

ただし、このrotationという変数は、Unityの内部ではQuaternionという四元数を持つ型で保持されているため、以下のスクリプトのようにrotationの値を直接しても、オブジェクトの回転角度を取得することができません。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.Log(transform.rotation);  // rotationの値を表示させる
    }
}

そこで、eulerAnglesの変数を使うことで、Quaternionの値ではなくオブジェクトの回転角度であるオイラー角を取得することができます。

なお、Quaternionについては、以下のページも参考にしてみてください。

Quatanionからオイラー角へ変換できる

eulerAnglesは、オブジェクトから回転角度を取得するだけでなく、Quaternionの値をオイラー角に変換して取得することができます。

Quaternionは、オブジェクトの回転をx・y・z・wの4つの値で表現している構造体で、これらの値は回転角度とは関係ない値になっています。

そのため、Quaternionの値からは角度が分からないため、eulerAnglesを使ってオイラー角に変換して取得することができます。

オブジェクトのオイラー角を取得する際は、Transform型の変数として扱いますが、Quaternionをオイラー角に変換して取得する際は、Quaternion型の変数として扱います。

eulerAnglesの使い方

ここからは、実際にeulerAnglesの使い方を紹介していきます。

オブジェクトの各軸に対する角度を取得する

オブジェクトの回転角度(オイラー角)を取得する場合は、

Transform.eulerAngles

と記述することで、角度をVector3型で取得することができます。

例えば、シーン内に配置したオブジェクトのrotationの値をインスペクターウィンドウから以下のように設定していた場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.Log(transform.eulerAngles);
    }
}

スクリプトの7行目でeulerAnglesの変数の値をコンソールウィンドウで表示させてみると、以下のようにオイラー角をVector3型で取得することができます。

また、例えばX軸の回転角度を取得したい場合は、

Transform.eulerAngles.x

「x」の変数を使って記述することで、X軸の角度をfloat型で取得することができます。

例えば、先ほどのスクリプトを以下のように修正してみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.Log("X軸の角度:" + Mathf.Round(transform.eulerAngles.x) + "度");
        Debug.Log("Y軸の角度:" + Mathf.Round(transform.eulerAngles.y) + "度");
        Debug.Log("Z軸の角度:" + Mathf.Round(transform.eulerAngles.z) + "度");
    }
}

7行目から9行目でeulerAnglesを使ってそれぞれの軸毎に記述してみると、

上記のように軸毎で角度を取得することができます。

なお、スクリプト内で使っているMathf.Roundメソッドは、小数部分を丸めるという処理を行っています。

localEulerAnglesでローカル座標の角度を取得できる

先ほどのtransform.eulerAnglesは、ワールド座標におけるオブジェクトの回転角度を取得しています。

親オブジェクトからの相対的な回転角度を取得したい場合は、ローカル座標空間におけるオブジェクトの回転角度を取得できるlocalEulerAnglesを使用します。

使い方はeulerAnglesと同じく、

Transform.localEulerAngles

と記述することで、Vector3型で角度を取得することができます。

例えば、以下のように親オブジェクトの中に配置した子オブジェクトの回転角度を取得してみます。

親オブジェクトには、インスペクターウィンドウから以下のようにrotationを設定しています。

また、子オブジェクトには、先ほどと同じrotationを設定しています。

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

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Debug.Log("ワールド座標における回転角度:" + transform.eulerAngles);
        Debug.Log("ローカル座標における回転角度:" + transform.localEulerAngles);
    }
}

7行目では、先ほどのeulerAnglesの変数を使って、ワールド座標における回転角度を取得しています。

また、8行目では、localEulerAnglesの変数で、ローカル座標における回転角度を取得しています。

実際にゲームを実行してみると、

ワールド座標空間で取得した方は、親オブジェクトの回転の影響を受けた角度になっているのに対して、localEulerAnglesの方は、親オブジェクトから相対的に見た際の回転角度、つまりrotationに設定したそのままの値を取得することができているのが分かります。

Quaternionからオイラー角を取得する

Quaternionの値をオイラー角に変換して取得する場合は、

Quaternion.eulerAngles

と記述してあげます。

例えば、以下のオブジェクトに対して、回転させる処理を作ってみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    Quaternion rotaionQuaternion = Quaternion.AngleAxis(10f, Vector3.up);  // 回転させるQuaternionを作成

    void Update()
    {
        // スペースキーを押した場合
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Quaternion myQuaternion = transform.rotation;   // 自身の回転を取得
            Quaternion newQuaternion = myQuaternion * rotaionQuaternion;  // Quaternionを合成する
            transform.rotation = newQuaternion; // rotationにセットする
            Debug.Log(newQuaternion.eulerAngles);   // オイラー角を表示させる
        }
    }
}

スクリプトの5行目で、回転させたいQuaternionをAngleAxisメソッドで作成しています。

このAngleAxisメソッドは、引数で角度を指定することで、Quaternionの回転を作成することができ、ここではVector3.upとしてオブジェクトの縦軸を中心に回転させるQuaternionを作成しています。

Quaternion.AngleAxis(角度, 回転軸);

スペースキーを押した場合の12行目で、自分自身のrotationの値をQuaternion型で取得しておきます。

そして、作成したQuaternionを13行目で合成し、その値を14行目でセットしてオブジェクトを回転させる処理を行っています。

また、15行目で合成したQuaternionのeulerAnglesの値を取得して、コンソールウィンドウに表示させてみると、

上記のようにスペースキーを押す度に、Quaternionからオイラー角を取得することができています。

まとめ

このページでは、Unityでオイラー角を取得することができるeulerAnglesについて、どんな変数なのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

eulerAnglesは、オブジェクトやQuaternionの回転角度であるオイラー角Vector3型で取得することができる変数です。

このeulerAnglesを使うことで、インスペクターウィンドウのrotationで表示される角度を取得することができます。

また、Unityでは回転をQuaternionで表しますが、このQuaternionをオイラー角に変換する場合にも、eulerAnglesを使うことができます。

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

コメント