再利用动画控制人物移动的过程中,实现智能转向(自动判断向左还是向右转)功能的方法有许多种,效果不一而足,代码量也千差万别,在这里,博主给出以下四种可以实现转向方法以供参考
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);
给出一张示意图:
———————————————————————————————————————————————————————————————————————————
后两种方法重在判断应该左拐还是右拐的逻辑代码的实现上,虽然篇幅较长,但有助于熟练掌握智能转向的本质
以上为本人ThirtythreeStars(33星)的原创博客,如有错误欢迎指正,如需转发著名出处和作者即可