欧拉角(eulerAngle)
用三个角度来保存方位
x,z沿自身坐标旋转;y沿世界坐标旋转
API: Vector eulerAngle = this.transform.eulerAngles;
欧拉角 优点:
仅用三个数字表达方位,占用空间小
沿坐标轴旋转的角度为单位,符合人的思考
任意三个数字都是合规的,不存在不合规的欧拉角
欧拉角 缺点:
①对于同一个方位,存在多个欧拉角描述,无法判断多个欧拉角代表的角位移是否相同。
例如:
--角度(0,5,0)与角度(0,365,0)
--角度(0,-5,0)与角度(0,355,0)
--角度(250,0,0)与角度(290,180,180)
*为了表示任意方位都有独一无二的表示,unity限制了角度范围,X轴限制在-90到90之间,y与z轴限制在0-360之间。
②万向节死锁
物体沿x轴旋转±90°,自身坐标z轴与世界坐标y轴将重合,此时将失去一个自由度。
在万向节死锁情况下,规定沿y轴的旋转全归到z轴。
四元数(Quaternion)
API: Quaternion qt=this.transform.rotation;
!!!欧拉角→四元数
this.transform.rotation=Quaternion.Euler(x,y,z);
四元数运算:
①四元数与向量相乘:
②四元数与四元数相乘:
可以实现组合旋转 例如:
Quaternion.Euler(0,30,0)*Quaternion.Euler(0,20,0)=Quaternion.Euler(0,50,0);
四元数 优点:
①避免万向节死锁
②可使物体沿自身Y轴旋转
四元数 缺点:
①难于使用,不建议单独修改某个数值
②存在不合理的四元数
总结:
欧拉角 方便,但是表达方式不唯一,还有万向节死锁
四元数 没万向节死锁,但是难使