Unity --- quaternion(四元数)类API

1.欧拉角转四元数 --- 调用方法 ; 四元数转欧拉角 --- 调用属性 

2.上面这个方法是绕给定轴/角进行旋转 1.第三个方法 --- LookRotation() --- 该方法需要一个Vector3类对象(以向量的形式)作为参数 --- 该方法会返回一个四元数 ,返回的这个新的四元数能够使物体自身坐标系的Z轴向量会旋转到与方法给定的向量的方向一致。

 2.但是这个方法有一个缺点,就是如果我们直接将得到的四元数赋值给this.transform.rotation的话,确实能够实现注视转向的效果,但是这种直接改变游戏物体的旋转四元数的方式呈现出的效果就是上一帧旋转到这,下一帧就旋转到另一个地方的跳跃式旋转(类似于this,transform.LookAt()方法) --- 这种方式不够自然,不符合人类逐渐运动的直觉,因此为了实现逐渐运动(旋转)过去的效果,我们需要引入另一个方法 --- Lerp方法!

3.再次强调Lerp方法需要三个参数,数值起点,数值终点以及比例参数

其能实现的效果是:每调用一次该方法就会返回一个数值,且数值不会小于起点大于终点

具体的数值选取步骤如下:

a.确定当前起点k,确定起点k到终点m的长度x = m - k,确定比例参数z

b.返回数值p --- p = k + x*z 

c.更改起点值 k = p

上面就是调用一次lerp方法后会执行的步骤,多次调用就是上面步骤的不断重复

(PS:Vector3中的Lerp方法的数值起点,数值终点的参数类型是Vector3,同时方法的返回类型也是Vector3,而Quaternion中的数值类型则是Quaternion,方法的返回类型则是Quaternion)

4.综上,如果想实现逐步转过去的话基本逻辑就是:

a.通过LookRotation方法计算出旋转终点四元数(物体当前四元数即为起点),同时确定好调用方法的时间间隔

b.将确定好的起点终点,以及比例作为参数传给Lerp方法

c.按照预先设计好的时间间隔不断调用Lerp方法,同时在获得方法返回值后,将返回值赋值给 this.transform.rotation --- 以此实现数值的逐渐变化,在视觉上呈现出逐步旋转的效果

1.用Lerp进行旋转的效果是 :先快后慢的向目标旋转,如果想实现匀速的向目标旋转的话有两种方式:a.使用动画曲线,将曲线设为匀速变化的形态 --- 具体形态就是45°斜直线

b.第二种就是换一个方法 --- 将RotateToward()方法即可 --- 换了方法后参数不用变 

1.将差值改为插值!

2.需要注意的是 --- 所有的插值方法Lerp除非比例参数为1,不然最终都只能无限靠近终点而无法到达终点

1.如何判断两个四元数对应的旋转角度之间差多少度?

答:Quaternion提供了一个方法 --- Angle() --- 该方法需要我们提供两个四元数作为参数 --- 调用方法后会返回一个浮点数float,该浮点数的大小就是两个四元数对应的旋转角度之间的差值 1.如何使得一个游戏物体的自身坐标系的x轴转向指定目标呢?

上面是一种方法 --- 首先this.tranform.right获得的属性right是可读可写的属性

a.如果在没有修改的情况下读的话,默认返回一个Vector3向量对象,该向量的方向是当前物体自身坐标系的x轴方向,大小为1(向量是在世界坐标系中表达的)

 b.如果进行写操作的话,比如我们传入一个新的向量,那么此时当前物体自身坐标系的x轴方向会和新的向量的方向一致,大小仍为1(PS:当前物体的整个自身坐标系都会随着x轴的变化而跟着变化 --- 因为x,y,z轴相互垂直,一个轴方向变了其它轴的方向也要跟着一起变)

this.tranform.up,  this.tranform.forward....等等属性都是同理的

2.用上面这种方式确实能够实现物体的x轴的转向指定的位置(通过改变向量),但是呈现出的效果是跳跃式转向,如果我们想实现渐近式转向该怎么做呢?

答案就是:使用插值方法来进行转向

a.首先我们需要获得当前物体旋转到目标位置后的四元数是多少

获取方式是通过调用Quaternion中的静态方法 --- FromToRotation来实现 --- 该方法需要两个参数 --- 向量a,向量b --- 调用该方法后可以获得一个四元数对应的旋转角度 = 从向量a转向向量b所需的角度

b.调用Lerp方法,给定起点 --- 物体当前的旋转四元数,给定终点 --- a步骤求得的最终四元数,以及比例参数(不要忘了动画曲线)

猜你喜欢

转载自blog.csdn.net/qq_51947882/article/details/129963129