参考资料
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的概念