どうもなおゆです。
オブジェクトを回転させる時に、オイラー角など色々なところでつまづいたので記事に残しておきます。
rotationとRotateの違い
私がUnityを触り始めた時にまず混乱したのがこの二つです。ほとんど同じ雰囲気を出してますもんね。
rotationは座標情報
rotationはオブジェクトが持っているtransformコンポーネントの回転( rotation )の部分のことです。下の画像のようにインスペクターに表示されていますね。
Rotateは関数
Rotateは現在の座標に角度を追加できる関数です。
transform.Rotate(0f, 10f, 0f);
これで現在の座標のy軸に10度プラスすることができます。Updateで行うとクルクル回りますので、少しずつ一定の角度を与え続ける場合などにいいと思います。
ちなみにこのRotate関数は第四引数に「Space.World」を指定することで、ワールド座標での回転を与えることができます。指定しない場合はローカル座標です。
transform.Rotate(0f, 90f, 0f, Space.World);
オブジェクトの角度情報を取得する
オブジェクトを回転させるうえで覚えておきたいポイントが二つあります。
- transform.rotationの中身はQuaternionという構造体。
- transform.eulerAnglesでオイラー角の値を指定・参照できる。
まず初めに言っておくと、初心者はQuaternionについて深く考えない方が良いです(笑)。私も詳しくないのでQuaternionの説明は少しだけにします。
Quaternion(クォータニオン)とは?
Quaternionは回転を表すのに使われる四元数で(x, y, z, w)の成分からなっています。
え…w?
Unityのスクリプトリファレンスには以下のように記載されています。
クォータ二オンは複素数に基づいており、直感的に理解するのは容易ではありません。個々のクォータニオンの成分 (x,y,z,w) にアクセスしたり変更したりすることはほとんどありません。
ここは素直に、私は考える行為をやめました。
でも気になる事はrotation(回転)の数値は(x, y, z)ですよね。ここで覚えておきたいのは、rotationはあくまで内部的にQuaternion(四元数)だという事です。
つまりVector3 型では取得できないんですね。
でもVector3 型、いわゆる(x, y, z)3軸のオイラー角の方が理解しやすいですよね?なんとかしてオイラー角を使ってオブジェクトを回転させたいですよね。
eulerAngles(オイラーアングルス)とは?
そこで出てくるのがこのeulerAngles変数を使うことでオイラー角を指定できます。
え?Rotate関数と同じじゃんと思うかもしれませんが、Rotate関数は指定した角度を加算するのに対し、eulerAngles変数は指定した座標に変換します。
transform.eulerAngles = new Vector3 (0, 10, 0);
これを実行するとクルっとy軸が10度になります。元の座標が何度だろうと(0, 10, 0)になります。
使用方法としてはスワイプなどのカメラ移動など、決まった座標に移動させたい場合などに向いていると思います。
コメント