增加Steering的派生类
----SteeringForPursuit类 追逐行为类
追逐行为解读图:
本案例的条件判断,通过判断
①物体朝向与目标朝向夹角的角度 ----------图中红色角度
②物体朝向与物体到目标当前位置向量所成的角度 ----------图中蓝色角度
来让物体做出两种追逐行为:
①物体按靠近行为的方式追逐目标
②物体按预测目标移动位置来追逐目标
预测追逐行为解读图:
案例中:
判断条件①限制了物体朝向与目标朝向夹角少于180度---------即:控制目标与物体面向移动时不进行预测追逐
判断条件②限制了物体朝向以及目标在物体的相对方向的夹角少于90度-------即:目标不能处于物体身后
以上条件 使得目标只能在物体朝向前方的范围,以及物体与目标朝向者同一块移动区域。
目标应处于条纹区域才能触发预测追逐行为。
预测时间= 两目标距离矢量的长度/(物体最大速度+目标当前速度) -----------当前还不知道是什么理论.. 案例中的公式
预测速度 = (目标位置矢量+目标速度矢量*预测时间 - 物体当前位置矢量)的标准化运算 *物体运动的最大速度
预测速度是通过 计算出预测的目标运动后的位置,作为最终目标位置,减去物体位置向量,求出新的速度方向
通过最新的速度方向减去物体当前速度方向矢量,获得实际的操控力向量。
案例代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SteeringForPursuit : Steering {
public GameObject target;
private Vector3 desiredVelocity;
private Vehicle m_vehicle;
private float maxSpeed;
// Use this for initialization
void Start () {
m_vehicle = GetComponent<Vehicle>();
maxSpeed = m_vehicle.maxSpeed;
}
public override Vector3 Force()
{
Vector3 toTarget = target.transform.position - transform.position;
float relativeDirection = Vector3.Dot(transform.forward, target.transform.forward);
Debug.Log("relativeDirection:" + relativeDirection);
//物体与目标朝向所成夹角的度数的范围的
//以及物体朝向与 物体与目标距离所成向量的夹角的度数范围
//来作为物体追逐目标时候是采取预测追逐还是靠近追逐的判断条件
if((Vector3.Dot(transform.forward,toTarget)>0)&&relativeDirection<-0.95f)
{
desiredVelocity = (target.transform.position - transform.position).normalized * maxSpeed;
return (desiredVelocity - m_vehicle.velocity);
}
//计算预测时间
float lookaheadTime = toTarget.magnitude / (maxSpeed + target.GetComponent<Vehicle>().velocity.magnitude);
//计算预测速度
desiredVelocity = (target.transform.position + target.GetComponent<Vehicle>().velocity * lookaheadTime - transform.position).normalized * maxSpeed;
//返回操控力向量
return (desiredVelocity - m_vehicle.velocity);
}
}
参考书籍:《unity3d人工智能编程精粹》 王洪源等著