Unity四元数总结

1.任意欧拉角转为对应四元素

用Quaternion rot=Quaternion.Euler(30,60,90)来把角度转化为相应四元素,旋转顺序是,先绕Z轴转动90度,再绕X轴转动30度,最后绕Y轴转动60度

2.绕指定轴旋转指定角度相应的四元素

Quaternion rot= Quaternion.AngleAxis(60, transform.forward);意思为绕自身正方向转60度其相应的四元素。

3.两个四元素相乘,代表按顺序进行两次旋转:

Quaternion rot1=Quaternion.Euler(0,30,0);Quaternion rot2=Quaternion.Euler(0,0,45);Quaternion rot=rot2*rot1;意思是先绕y旋转30度再绕z旋转45度,所以,你要先绕哪个四元素先旋转就放最右边

4.四元素与向量相乘,得到的是将原向量旋转后的新向量:

Vector3 to = Quaternion.AngleAxis(45, Vector3.up)* Vector3.forward    to是将Vector3.forward绕Vector3.up旋转45度后得到的新向量

5.已知两个向量,求从一个向量转到另一个向量的四元数:

Quaternion rot=Quaternion.FromToRotation(Vector3.up,Vector3.forward);这的意思是创建一个从y轴正方向到z轴正方向的旋转角度所对应的四元数

例子:

Vector3 aimDirection=(targetTrans.position – transform.position).normalized;

Quaternion rot = Quaternion.FromToRotation(transform.up,aimDirection);

transform.rotation = rot * transform.rotation;

这的意思是此游戏对象自身转向这个计算出来的偏转角所对应的四元数,如果将此至于Update中就可以做到不断对准目标

6.创建一个让Z轴正方向和Y轴正方向指向规定方向的旋转

Quaternion rot = Quaternion.LookRotation(Vector3.right, Vector3.down);

这的意思是创建一个让Z轴正方向指向世界坐标x轴正向,y轴正方向竖直向下的旋转角度所对应的四元数

Eg:  

 当你设定的y轴方向与z轴方向不垂直的时候,系统会先以你设定的z,y轴为基准确定一个平面,平面确定了,就可以确定x轴,然后又根据Z和X轴所确定的平面反推出真正的与X轴所垂直的Y轴

Vector3 aimDirection=(targetTrans.position – transform.position).normalized;

Quaternion rot = Quaternion.LookRotation(aimDirection);此函数有两个参数,分别是你所设定的轴的方向,分别是forward和upward,当然,upward如果不填,则默认为forward的垂直向上方向

transform.rotation = rot;

总结:其实这个函数与Quaternion.FromToRotation有些类似,但是不同点在于这函数可以更方便的面向目标,并且不用在最后一步做transform.rotation = rot * transform.rotation;四元数的叠加操作

7.已知两个由四元数代表的旋转角度,求出从一个角度渐变到另一个角度的增量

Quaternion rot=Quaternion.Euler(0,30,0)

Quaternion targetRot= rot*transform.rotation;

transform.rotation= Quaternion.RotateTowards(transform.rotation,targetRot,90*Time.deltaTime);

意思为游戏对象的角度会逐渐向targetRot以90*Time.deltaTime的角速度(90度每秒)逐渐逼近,因为这代码并不能够在一帧中完成所以要放于update中

8.两个四元数之间的线性插值lerp

transform.rotation=Quaternion.Lerp(transform.rotation,Vector3.up,0.5f);

第一个参数是起始的角度所对应的四元数

第一个参数是终点的角度所对应的四元数

第三个参数是这个过程需要多少秒

9.两个四元数之间的球形插值Slerp

transform.rotation=Quaternion.Slerp(transform.rotation,Vector3.up,0.5f);

第一个参数是起始的角度所对应的四元数

第一个参数是终点的角度所对应的四元数

第三个参数是这个过程需要多少秒

Lerp和Slerp无明显区别,Slerp顺着球来旋转,每帧性能消耗较大,Lerp顺着直线转动,每帧角度不平均,但是相对的性能开销较小

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值