Unityでオブジェクトを回転させる方法まとめ

2017.06.11 自習室 0
Unityでオブジェクトを回転させる方法まとめ

回転方法はいったん「指定した角度までなめらかに回転させたい時に便利な方法」「指定した角度まで一気に回転させたい時に便利な方法」「ずっと回し続けたいときに便利な方法」「その他の方法」の4つに分類しています。

環境

  • Unity 5.6.0f3
  • このページで使用している環境の設定方法はこちらから(説明のため、このページでは画面にcubeを追加しています)

回転方法の分類

指定した角度までなめらかに回転させたい時に便利な方法

  • Mathf.LerpAngleを使って回転する
  • Quaternion.LookRotationを使って回転する
  • Quaternion.RotateTowardsを使って回転する
  • Vector3.RotateTowardsを使って回転する
  • Quaternion.Slerpを使って回転する

指定した角度まで一気に回転させたい時に便利な方法

  • Quaternion.AngleAxisを使って回転する
  • Quaternion.Eulerを使って回転する
  • Quaternion.eulerAnglesを使って回転する
  • transform.eulerAnglesを使って回転する

ずっと回し続けたい時に便利な方法

  • Transform.Rotateを使って回転する
  • rigidbody.AngularVelocityを書き換えて回転する

その他の方法

移動と回転を同時に処理する
Transform.RotateAroundを使って回転する
他のオブジェクトの情報をもとに回転する
Quaternion.ToAngleAxisを使って回転する

回転関係の参考になる記事

  • UnityでRotation(Quaternion)をうまく使いたい 2015.5.31
  • UnityのベクトルとQuaternionによる回転について 2014.8.2
  • Unityで回転したかったお話 2015.1.20
  • クラスを問わず回転操作に関係する関数 2014.10.3
  • UUnity基本メソッド覚書 2013.03.21
  • ク座標変換:クォータニオン、オイラー角

指定した角度までなめらかに回転させたい時に便利な方法

Mathf.LerpAngleを使って回転する

  • public static float LerpAngle(float a, float b, float t);
  • aからbまでの間で、tで指定した割合の値をfloatで返してくれる。
  • tは0から1の間の値。
  • transform.eulerAnglesと併用すると、指定した角度までなめらかに回転させることが簡単にできる。
  • 返ってくる値は-180から180に制限されているので注意が必要(180度以上回転させようとすると逆方向に回転する)
この回転方法の参考リンク
公式スクリプトリファレンス

Quaternion.LookRotationを使って回転する

  • public static Quaternion LookRotation(Vector3 forward, Vector3 upwards = Vector3.up);
  • 引数が2つあるのがよくわからないが、ベクトルを渡すとその方向へのQuaternionを返してくれるっぽい。
  • Quaternion.Slerpと併用して、なめらかに敵の方を向かせる処理などに使われる例が多い。
この回転方法の参考リンク
公式スクリプトリファレンス
座標間の角度 Quaternion.LookRotation 2015.11.05
UnityでのAI実装:任意のオブジェクトの方向を向かせる 2010.11.08

Quaternion.RotateTowardsを使って回転する

  • public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);
  • fromからtoまで、1フレーム最大maxDegreesDeltaの角度で回転する。
  • from,toの指定はQuaternionなので、Quaternion.Eulerと一緒に用いられることが多い。
  • 指定した方向にゆっくり回転させたい場合に使いやすい
  • fromに自分のtransform.rotation、toに他のオブジェクトのtransform.rotationを指定すると他のオブジェクトと回転を同期させたりできる。
この回転方法の参考リンク
公式スクリプトリファレンス
ゆっくりと指定の座標に向ける Quaternion.RotateTowards 2015.11.07

Vector3.RotateTowardsを使って回転する

  • public static Vector3 RotateTowards(Vector3 current, Vector3 target, float maxRadiansDelta, float maxMagnitudeDelta);
  • currentからtargetへ向けて回転するベクトルを返してくれる。
  • maxRadiansDeltaの値を変えることで回転速度の調整が可能。1以上の値を与えると一気に回転する。
  • maxMagnitudeDeltaはよく分からない。値を変えても特に挙動が変わらないし、0fにしている例しか見当たらなかった。
  • currentをtransform.positionにすると回転しないので注意。回転してもpositionが変わるわけではないので、おそらく毎フレーム巻き戻っているものと思われる。
  • maxRadiansDeltaにマイナスの値を与えると逆方向に回転する。
この回転方法の参考リンク
公式スクリプトリファレンス

Quaternion.Slerpを使って回転する

  • public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
  • aからbまで、tで指定した割合で回転するQuaternionを返してくれる。
  • tは0〜1の間の値。
  • LookRotationと併用して、なめらかに敵の方を向かせる処理などに使われる例が多い。
  • 敵の方を向かせる処理の例はLookRotationを参照してください。
  • Quaternion.RotateTowardsと似ているが、Quaternion.Slerpは等速回転ではない点が異なる。
  • aに自分のtransform.rotation、bに他のオブジェクトのtransform.rotationを指定すると他のオブジェクトと回転を同期させたりできる。
この回転方法の参考リンク
公式スクリプトリファレンス
【初心者の備忘録】オブジェクトAが、オブジェクトBを追いかける仕組みを作る 2015.09.19
AI開発&クォータニオン入門~3.敵キャラをプレイヤーに向かせる 2013.03.06

指定した角度まで一気に回転させたい時に便利な方法

Quaternion.AngleAxisを使って回転する

  • public static Quaternion AngleAxis(float angle, Vector3 axis);
  • 「axisで指定した回転軸に沿って、angle度回転する」Quaternionを返してくれるので、そのままtransform.rotationに代入すれば思い通りに回転させることができる。
この回転方法の参考リンク
公式スクリプトリファレンス
Unity 講義まとめページ – GP11 チーム制作 02 2011.10.12

Quaternion.Eulerを使って回転する

  • public static Quaternion Euler(float x, float y, float z);
  • 「Z座標を軸にz度、X座標を軸にx度Y座標を軸にy度回転する」Quaternionを返してくれるので、そのままtransform.rotationに代入すれば思い通りに回転させることができる。
  • 回転の計算順はz軸、x軸、y軸の順番
  • Quaternion.AngleAxisとほぼ同じ感じがするが、以下の記事を見るとAngleAxisの方が問題が起きないっぽい(英語の記事なので理解が間違っているかも)
  • https://forum.unity3d.com/threads/differnece-between-quaternion-euler-and-quaternion-angleaxis-to-rotate-an-object.184860/
  • 以下のようにベクトルで指定することも可能
  • public static Quaternion Euler(Vector3 euler);
この回転方法の参考リンク
公式スクリプトリファレンス

Quaternion.eulerAnglesを使って回転する

  • public Vector3 eulerAngles;
  • Quaternion.EulerやTransform.eulerAnglesと似ていて、この辺の違いはよく分からない。
この回転方法の参考リンク
公式スクリプトリファレンス
回転難しい

Transform.eulerAnglesを書き換えて回転する

  • public Vector3 eulerAngles;
  • eulerAnglesで回転する角度を指定する。Vector3(30, 40, 50)ならx軸で30度、y軸で40度、z軸で50度回転する。
  • 通常、unityのtransform.rotation(回転情報)を直接書き換えるにはクオータニオンで指定しなければいけないが、Transform.eulerAnglesを使うとオイラー角で角度を指定することができる。
  • インクリメントしてみてもパッと見は特に問題なく動作しましたが、公式に以下のような注意書きがあるので使用時は注意してください。
  • 公式サイトより:この変数は読み込んだり、絶対値の角度を設定するときのみ使用してください。角度が 360 度を超えたときには失敗するのでインクリメントしないようにしてください。
  • 公式サイトより:(eulerAngles.x = 10; のように) eulerAngles の一部だけ値を設定することはドリフトと予期せぬ回転につながるのでしないでください。 新しい値を設定するときは、上記のように一度にすべてを設定します。
この回転方法の参考リンク
公式スクリプトリファレンス
[Unity] transform.eulerAnglesについて 2015.07.09

ずっと回し続けたい時に便利な方法

Transform.Rotateを使って回転する

  • public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);
  • eulerAnglesで回転する角度を指定する。Vector3(30, 40, 50)ならx軸で30度、y軸で40度、z軸で50度回転する。
  • 角度にtime.deltaTimeを掛けると、1秒間に指定した角度回転する。
  • relativeToでローカル軸(Space.Self)、ワールド軸(Space.World)の切り替えが可能。指定しなければローカル軸になる。
  • ローカル軸、ワールド軸の違いは、スクリプトをアタッチするオブジェクトを最初から傾けておくとわかりやすいと思います。
  • 以下のように角度をfloatで指定することも可能
  • public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo = Space.Self);
この回転方法の参考リンク
公式スクリプトリファレンス

Rigidbody.angularVelocityを書き換えて回転する

  • public Vector3 angularVelocity;
  • Rigidbodyがアタッチされていないと使えない。
  • Rigidbodyの角速度ベクトルを直接書き換えるので、一度値を与えるとずっと回転しつづける。
  • 非現実的な挙動に繋がる可能性があるため、公式サイトでは推奨されていない。
この回転方法の参考リンク
公式スクリプトリファレンス
Unity でオブジェクトの回転軸を変更する 2014.06.09

その他の回転方法

Transform.RotateAroundを使って回転する

  • public void RotateAround(Vector3 point, Vector3 axis, float angle);
  • pointを中心に、axisで指定した回転軸に沿って、angle度回転する。
  • pointが自分の位置から離れている場合、移動と回転を同時に処理してくれる。
  • axisの向きによって回転方向を変えることができる。
この回転方法の参考リンク
公式スクリプトリファレンス
Unityで地面の上のキューブを転がす方法【Rotate Around編】

Quaternion.ToAngleAxisを使って回転する

  • public void ToAngleAxis(out float angle, out Vector3 axis);
  • Quaternionをangleとaxisに分解して値を返してくれるっぽい。
  • 返ってきたangleとaxisをQuaternion.AngleAxisにそのまま突っ込むと、元のQuaternionと同じように回転する。
この回転方法の参考リンク
公式スクリプトリファレンス

回転関係の参考になる記事

UnityでRotation(Quaternion)をうまく使いたい 2015.5.31 UnityのベクトルとQuaternionによる回転について 2014.8.2 Unityで回転したかったお話 2015.1.20 クラスを問わず回転操作に関係する関数 2014.10.3 Unity基本メソッド覚書 2013.03.21 座標変換:クォータニオン、オイラー角

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です