Unity之旋转,欧拉角

参考资料

gimbal lock 欧拉角的死锁问题

欧拉角

  • 欧拉角的思想就是,在旋转物体的时候,不是完全使用坐标,而是使用相对每个轴的旋转角度
  • 比如在旋转的时候,先绕世界的z轴转一定角度(和世界产生联系),然后再绕自己的坐标轴转两次

欧拉角的三个角度

  • pitch:俯仰
  • yaw:偏航
  • roll:翻滚

在发生着三种旋转的情况下,万向节可以通过自己的调节让中间的物体保持不变

万向节死锁

万向节就是一个让物体以单一轴旋转的装置,由彼此垂直的三个平衡环组成,可以让架子里面的物体保持角度不变
万向节

  • 在上面的三种旋转情况下,如果有两个方向的转轴重合了,就会失去一个自由度,产生死锁

Quaternion

也就是中文里面的四元数(x,y,z,w)

  • 在unity里面,一般使用quaternion来表示物体的旋转,因为使用quaternion不容易产生死锁问题
  • 数学推导挺复杂的,一般在unity里面实际用的时候不一定用得到
  • 注意,在unity里面,四元数的类型是Quaternion,欧拉角的类型是Vector3,注意类型的转换

常用函数

性质

  • eulerAngles:返回这个四元数本身代表的欧拉角。从transform.ratotion里面读取出来四元数之后,可以直接这样转换成欧拉角
  • x,y,z,w:可以直接返回四元数的数值,但是实际用的时候作用不大

静态方法

  • public static float Angle(Quaternion a, Quaternion b);
    • 如果有两个东西a和b同时绕着c转,a和c以及b和c之间都会产生角度
    • 返回两个旋转a和b之间的角度(直接返回角度,不用访问四元数)
  • public static Quaternion Euler(float x, float y, float z);
    • 从绕三个周的角度,得到这个旋转的四元数
  • public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
    • 在a和b的两个旋转里面插入一个新的旋转
    • t的range是[0,1],如果是0的话就是和a重合,是1的话就和b重合
    • 这个可以用来作为,从开始到结束,随着时间转动
  • public static Quaternion FromToRotation(Vector3 fromDirection, Vector3 toDirection);
    • 创建一个rotation,从一个vector3的方向(世界)转到另一个方向
  • public static Quaternion identity;
    • identity rotation (Read Only).
    • 也就是意味着不转!!!

四元数的理解

和我们在二次坐标系表示复数一样,四元数是一个四次元来表示complex number的概念