unity3D 彻底搞懂 Quaternion LookRotation FromToRotation SetLookRotation方法

我的问题是从LookRotation方法引入的。

我的场景:赛道、汽车、赛道上每隔一段摆放一个碰撞检测板;

我的目的:我在做一个赛车游戏的AI汽车导航。我使用的就是NavMeshAgent做导航,然后我发现汽车一直都是水平的,哪怕上坡下坡,也是水平的。然后我准备使用让汽车对准检测板的方法,使汽车在上下坡道时,可以使汽车顺着坡道,而不是水平。

这里为了研究“对准”这个问题,对目的进行简化:让汽车每次看向下一个检测板的位置,以便汽车可以始终方向正常的在赛道上行驶。

我使用的函数是:car.rotation = Quaternion.LookRotation(jianceban.trsansform.position - car.transform.position);


********************************************************************************LookRotation****************************************************************************

上面就是一个对LookRotation简单的应用。我突然想到了一个问题,那就是Quaternion.LookRotation(Vector3 forward)得出来的四元数,到低代表的什么意思?我知道的解释就是:“使用指定的向前方向创建一个四元数”。我是在完全搞懂之后,明白这句话意思的,我觉得应该有人还和我之前一样,比较凌乱。下面就是我的实验过程:

unity3D 彻底搞懂 Quaternion LookRotation FromToRotation SetLookRotation方法_第1张图片

我的实验工程中,有这么些对象:

mainrule (0,0,0)指代的是主角,是要使用lookrotation结果的对象;

forwardtarget  主角向前的目标

upwardtarget  主角向上的目标(当研究函数Quaternion.LookRotation(Vector3 forward, Vector3 upward)时,才用得上这个对象)

direction (0,0,0)主角三个方向的放大版,每个棍有圆球的一边为正方向,用来方便观察主角方向变化

mainCamera上挂的关键代码如下

	void Update () {
		Quaternion qua = Quaternion.LookRotation (forwardTarget.position - mainRule.position/*, upwardTarget.position - mainRule.position*/);
		text.text = qua.eulerAngles.ToString ();
		line.rotation = qua;
		line.position = mainRule.position;
	}

其中line,就是上面的direction。

实验一:

设置forwardtarget 坐标(6, 0, 0),这个时候如上图所示,direction的z轴指向了forwardtarget;

设置forwardtarget 坐标 (6,0,6),时 ,不再上图了,direction的z轴继续指向forwardtarget。

结论:LookRotation的参数forward,就是说,使当前向量的Z轴向量指向ForwardTarget需要的旋转量。之所以叫做ForwardTarget,是因为forward一般就指的是向前方向向量(1,0,0)。

实验二:

去掉上述代码中的一个注释,我们来实验:lookrotation(vector3 forward, vector3 upward)

设置forwardtarget坐标(6,0,6)

unity3D 彻底搞懂 Quaternion LookRotation FromToRotation SetLookRotation方法_第2张图片

再设置upwards坐标(-6,6,0)

unity3D 彻底搞懂 Quaternion LookRotation FromToRotation SetLookRotation方法_第3张图片

你看,在z轴对准红球的基础上,y轴,对准了绿球,当然由于z轴y轴有90度夹角,y轴不可能完全对准了。


其实说白了,LookRotation的含义就是,计算让Z轴对齐forward,让y轴对齐upward 所需要的旋转四元数。


*****************************************************************************SetLookRotation************************************************************************

SetLookRotation这个函数和lookrotation这个函数作用一样,区别就是,SetLookRotation是Quaternion的成员函数,也即是说,对某对象的rotation调用SetLookRotation方法,等同于将LookRotation计算出来的值赋值给某对象的Rotation。

****************************************************************************FromToRotation**************************************************************************

static Quaternion FromToRotation(Vector3 fromDiection, Vector3 toDirection)

根据两个向量计算出旋转量,计算出来的旋转量为从fromDiection,旋转到toDirection的旋转量。

这句话意思很明显了。就是计算旋转量。

那么LookRotation(Vector3 forward)计算的是,Z轴旋转到forward的旋转量。

推出:Quaternion.LookRotation(new Vector3(1,0,0)) == Quaternion.FromToRotation(Vector3.forward, new Vector3(1,0,0));

因为前者就是计算向前向量到当前向量(1,0,0)的旋转量的,其实现过程就是后者喽。


有一篇博客写的特别好,推荐下:

http://blog.csdn.net/kfqcome/article/details/10729551



你可能感兴趣的:(unity3d,四元数,Quaternion)