LoginSignup
0
0

More than 1 year has passed since last update.

UnityのSceneビューでドラックして設定した回転方向(local)とInspectorの値を一致させる方法

Posted at

問題:

Unityで3Dオブジェクトを回転させるときにSceneビューで赤青緑の線をマウスでドラックすると,任意の方向に回転(local座標)させることができます.
一方,1軸のみの回転を行っているのに関わらず,Inspectorの値はXYZの3つの値が変化します.
これは,オイラー座標の回転順序に起因する問題です.
UnityはZXYの順序でオブジェクトを回転させています.
しかし,Sceneビューで回転させる場合,指定したい角度に設定することが困難です.

解決法1:

回転順序の逆順でInspectorで回転させると,Sceneビューでの回転軸と対応します.
具体的には,
Y軸,X軸,Z軸の順でInspectorで回転させると一致します.(Unityでの回転順序(ZXY)の逆順)

解決法2:

最初にX軸を回転させてから他の軸を回転させたい場合があります.
その場合はScriptで順序を指定しましょう.
例えば,X軸,Y軸,Z軸の順で回転させたい場合,TypeをZYXに設定します.

Script参考元
https://light11.hatenadiary.com/entry/2019/01/24/223705

rot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class rot : MonoBehaviour
{
    public enum RotationType
    {
        ZXY,
        ZYX
    }

    [SerializeField, Range(-180, 180)] private float _x;
    [SerializeField, Range(-180, 180)] private float _y;
    [SerializeField, Range(-180, 180)] private float _z;

    [SerializeField] private RotationType _type;

    private void Update()
    {
        // X軸回転
        var rotX = Quaternion.AngleAxis(_x, new Vector3(1, 0, 0));
        // Y軸回転
        var rotY = Quaternion.AngleAxis(_y, new Vector3(0, 1, 0));
        // Z軸回転
        var rotZ = Quaternion.AngleAxis(_z, new Vector3(0, 0, 1));

        var quaternion = Quaternion.identity;

        if (_type == RotationType.ZXY)
        {
            quaternion = rotY * rotX * rotZ;
        }
        else if (_type == RotationType.ZYX)
        {
            quaternion = rotX * rotY * rotZ;
        }
        transform.rotation = quaternion;
    }
}

注意:

今回はオイラー角を用いることで生じる問題の一つであるジンバルロックを考慮しないものとします.
ジンバルロックについてはこちらの動画や他サイトを参照してください.

修正ログ:

2021/08/23:自身の備忘録用に簡単にまとめた

Todo:

数学的な説明
図の挿入

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0