躲避行为
你应该意见猜到了,躲避行为是追捕的反行为,它与追捕的不同点在于,追捕是在seek”未来目标”,而躲避是在flee”未来目标”:
AS 版本
public function evade(target:Vehicle):void {
var lookAheadTime:Number = target.position.dist(_position) / _maxSpeed;
//计算此时追上目标的预计时间,即lookAheadTime.
var predictedTarget:Vector2D = target.position.add(target.velocity.multiply(lookAheadTime));
//在这段时间内,目标以现在的速度,预计会到达的位置,即"未来目标"
flee(predictedTarget);
//避开这个"未来目标"
}
target 是追逐着,追逐者到智能体的距离 / 最大速度(逃跑者使用的是最大速度),计算出追到所要花费的时间,
预测追逐者在经过lookAheadTime 之后所要所在的位置。
然后智能体只要逃离这个位置即可。
预测追逐者在经过lookAheadTime 之后所要所在的位置。
然后智能体只要逃离这个位置即可。
-----------------------------
c++ 版本
//----------------------------- Evade ------------------------------------
//
// similar to pursuit except the agent Flees from the estimated future
// position of the pursuer
//------------------------------------------------------------------------
Vector2D SteeringBehavior::Evade(const Vehicle* pursuer)
{
/* Not necessary to include the check for facing direction this time */
Vector2D ToPursuer = pursuer->Pos() - m_pVehicle->Pos();
//uncomment the following two lines to have Evade only consider pursuers
//within a 'threat range'
<span style="color: rgb(102, 102, 102); font-family: Tahoma, Arial; line-height: 24px; text-align: justify; background-color: rgba(255, 255, 255, 0.8);">//取消以下两行逃避只考虑追求者的威胁范围内</span>
const double ThreatRange = 100.0;
if (ToPursuer.LengthSq() > ThreatRange * ThreatRange) return Vector2D();
<p class="p0" style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10.5pt; font-family: 'Times New Roman'; background-color: rgb(240, 240, 240); background-position: initial initial; background-repeat: initial initial;">//<span style="font-family:宋体;">预测的时间正比于追逐者与逃避者的距离;反比于智能体的速度和。</span></span></p> double LookAheadTime = ToPursuer.Length() /
(m_pVehicle->MaxSpeed() + pursuer->Speed());
//now flee away from predicted future position of the pursuer
return Flee(pursuer->Pos() + pursuer->Velocity() * LookAheadTime);
}
预测的时间正比于追逐者与逃避者的距离;反比于智能体的速度和,是因为要预测追逐者可能的位置,逃跑者的最大速度 加上 追逐者的速度,再用 两者的距离去 除它,加上
两者的速度,注意速度是double类型,这样就速度比他们自己都快,这样算出来的时间就更小,使预测的时间尽可能小
注意这里逃跑者使用的是最大速度,上一节,追逐者使用的是最大速度。因为一个用seek,一个用fell,都是最大速度接近或离开,参见seek和feel行为,追逐者和逃跑者永远是相对的,
一个用尽办法追,一个用尽办法逃。
最后
pursuer->Velocity() * LookAheadTime 用追逐者乘以这个时间,表示追逐者在这个时间未来预测的位置。