我的问题是从LookRotation方法引入的。
我的场景:赛道、汽车、赛道上每隔一段摆放一个碰撞检测板;
我的目的:我在做一个赛车游戏的AI汽车导航。我使用的就是NavMeshAgent做导航,然后我发现汽车一直都是水平的,哪怕上坡下坡,也是水平的。然后我准备使用让汽车对准检测板的方法,使汽车在上下坡道时,可以使汽车顺着坡道,而不是水平。
这里为了研究“对准”这个问题,对目的进行简化:让汽车每次看向下一个检测板的位置,以便汽车可以始终方向正常的在赛道上行驶。
我使用的函数是:car.rotation = Quaternion.LookRotation(jianceban.trsansform.position - car.transform.position);
********************************************************************************LookRotation****************************************************************************
上面就是一个对LookRotation简单的应用。我突然想到了一个问题,那就是Quaternion.LookRotation(Vector3 forward)得出来的四元数,到低代表的什么意思?我知道的解释就是:“使用指定的向前方向创建一个四元数”。我是在完全搞懂之后,明白这句话意思的,我觉得应该有人还和我之前一样,比较凌乱。下面就是我的实验过程:
我的实验工程中,有这么些对象:
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; }
实验一:
设置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)
再设置upwards坐标(-6,6,0)
你看,在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