向左还是向右?Unity中俯视视角下人物智能转向的控制方法

时间:2024-04-09 08:55:08

再利用动画控制人物移动的过程中,实现智能转向(自动判断向左还是向右转)功能的方法有许多种,效果不一而足,代码量也千差万别,在这里,博主给出以下四种可以实现转向方法以供参考


1.利用三维向量Vector3.Slerp插值实现转向:


             transform.forward = Vector3.Slerp(transform.forward, TargetDir, Time.deltaTime*speed);

最为简短易懂的方法,TargetDir是目标方向,speed是转向速度;

————————————————————————————————————————————————————————————————————————————

2.利用四元数的Quaternion.Lerp插值实现转向:


    //先得到一个旋转(四元数newRotation ),他的方向是目标朝向,转轴是y轴

            Quaternion newRotation = Quaternion.LookRotation(TargetDir, transform.up);

    //在当前朝向的四元数通过插值的方法平滑变为目标朝向的四元数
            transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, Time.deltaTime * rotatespeed);

————————————————————————————————————————————————————————————————————————————


以上两种方法在实现转向的思想上相似,插值的过程中对于该向左转还是右转会自动判断最近的转法,所以并不需要做过多的思考,但考虑到在三维中常用的欧拉角坐标存在着万向节锁的问题,所以第二种方法更稳妥一些;

下面给出两种利用数学知识判断方向的并实现转向的方法:


————————————————————————————————————————————————————————————————————————————

3.利用向量叉乘判断旁向并实现转向:


    //求当前朝向与目标朝向的夹角
            float angle = Vector3.Angle(NowDir, TargetDir);
            //求当前朝向和目标朝向的叉积
            Vector3 crossVector = Vector3.Cross(NowDir, TargetDir);
            //根据左手定则可以判断应该朝那边转向
       if (crossVector.y < 0)//结果小于0说明目标方向在左,应该左拐
       {
           angle = -angle;
                }       
       else { }//如果叉乘结果向上,应该右拐,angle可以不做处理

       //进行旋转,angle大于0默认右转,angle小于0则左转
       transform.Rotate(Vector3.up * angle * Time.deltaTime * rotatespeed);

关于叉乘到底是啥不在这里进行讲解,通过百度理解它应该不难


————————————————————————————————————————————————————————————————————————————

4.利用目标朝向与左右正交向量的夹角大小判断左右转向:


    //当前朝向与目标朝向的夹角
            float angle = Vector3.Angle(NowDir, TargetDir);
            //当前朝向的左正交向量
            Vector3 leftOrthogonal = new Vector3(-NowDir.z, 0, NowDir.x);
            //当前朝向的右正交向量
            Vector3 rightOrthogonal = new Vector3(NowDir.z, 0, -NowDir.x);
            //目标朝向与左,右正交向量的夹角
            float angleleft = Vector3.Angle(TargetDir, leftOrthogonal);
            float angleright = Vector3.Angle(TargetDir, rightOrthogonal);
            //如果目标向量与左正交向量夹角更小,则可以判断此时左转更恰当
            if (angleleft < angleright)
            {
                angle = -angle;
            }
            else { }//如果目标向量与右正交向量夹角更小,angle可以不做处理

            //进行旋转,angle大于0默认右转,angle小于0则左转
            transform.Rotate(Vector3.up *angle* Time.deltaTime * rotatespeed);


给出一张示意图:

向左还是向右?Unity中俯视视角下人物智能转向的控制方法


———————————————————————————————————————————————————————————————————————————


后两种方法重在判断应该左拐还是右拐的逻辑代码的实现上,虽然篇幅较长,但有助于熟练掌握智能转向的本质

                以上为本人ThirtythreeStars(33星)的原创博客,如有错误欢迎指正,如需转发著名出处和作者即可