一.欧拉角
欧拉角最容易表示,用三个变量X,Y,Z能够直观的表示绕着某个轴的旋转角度。函数
在Unity里就是Transform组件的Rotation里的X Y Z三个变量表明了欧拉角动画
二.四元数
四元数相比于欧拉角就比较复杂了,由四个变量组成(在Unity中称为X,Y,Z,W),可是这些变量的值不表明旋转角度,因此可能给你一个向量(0。7,0,0,0.7)你并不知道实际旋转的角度,固然四元数的详细解释须要数学方面的深刻研究,有兴趣的能够自行查找有关资料orm
由于在Unity没有可视化界面能够调整四元数(由于真的调了也不直观看到旋转的角度),因此咱们只能用脚原本访问
三.脚本中内容
欧拉角若是在脚本中表示呢?
是否是想到以前图中的那个Rotation,那你是否是天然而然的想到了经过transform.rotation访问呢?若是你是这样想的,那就错了!
在Unity中transform.rotation表明的是四元数!附上官网证实!get
那到底如何表示欧拉角呢?其实表示很简单,并附上官网解释数学
transform.eulerAngles =new Vector3(20,300,40);
1it
当咱们以上述代码运行后会发现Rotation中的Y值是-60,那是由于面板上的Rotation中的X Y Z值范围是在(-180,180),对于代码中超出的部分会自动进行计算映射到范围内io
四元数的代码表示就是以前的transform.rotation,那你确定会想欧拉角和四元数以前可否转换呢,知道其中一个的值,若是改变成对方呢?代码以下form
//欧拉角->四元数
//经过Quaternion.Euler() 传递一个Vector3向量的欧拉角
transform.rotation = Quaternion.Euler(new Vector3(20, 300, 40));class
//四元数->欧拉角
transform.rotation.eulerAngles;//对你没看错 直接能够转换获取
1
2
3
4
5
6
三.区别
欧拉角:
优势:三个角度组成,直观,容易理解
优势:能够进行从一个方向到另外一个方向旋转大于180度的角度
缺点:死锁问题——万向节死锁 万向节死锁介绍
四元数
优势:不存在万向节死锁问题
优势:存储空间小,计算效率高
缺点:单个四元数不能表示在任何方向上超过180度的旋转。
缺点:数字表示不直观
四.经常使用API
Quaternion.LookRotation() 使其转向某个方向效率
函数传递的参数的一个Vector3的向量 这个向量表示的是要看向的向量,一般用目标的positon和自身的position进行相减求得此向量
Vector3 pos = target.transform.position - transform.position;
transform.rotation = Quaternion.LookRotation(pos);
1
2
是否是以为和transform.LookAt()效果很像…
//和上面代码获得的效果相同
transform.LookAt(target.transform);
1
2
Quaternion.Slerp() 平滑进行转动动画
函数传递的参数分别是 当前GameObject的四元数、目标要转向的四元数 和 一个插值时间
咱们看个例子
void LookAtTarget()
{
if (Input.GetKey(KeyCode.Space))
{
Vector3 dir = target.transform.position - transform.position;
dir.y = 0;//不让Player有y轴上的倾角
Quaternion target = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime);
}
}
1
2
3
4
5
6
7
8
9
10
咱们将上述的LookAtTarget()方法放到Update()函数中进行执行
就能够看到平滑的转动
Quaternion.Lerp() 说实话我的用起来和Slerp()区别不大
图中红线框出来的就是区别:使用Lerp()进行旋转的速度较快,可是在旋转角度较大的时候,效果会糟一点。
Quaternion.RotateTowards()
传递两个四元数,和一个角度增量值,使第一个四元数逐渐趋近于第二个四元数并最终相等
void Update()
{
float step = 3 * Time.deltaTime;
transform.rotation = Quaternion.RotateTowards(transform.rotation,target.transform.rotation,step);
}
1
2
3
4
5
结果就是当前物体的四元数和目标的四元数相等
Transform.RotateAround()
传递一个参照点point、绕哪一个轴转axis和增量角度angle
void Update()
{
float step = 3 * Time.deltaTime;
transform.RotateAround(target.transform.position,Vector3.up,step);
}
1
2
3
4
5
五.总结差很少基础概念就这些了吧,若是要深刻了解的话,建议仍是看API,而且本身多动手尝试一下数据~---------------------