我正在努力了解如何实现和组合自主代理的导向向量,如Craig Reynolds所述。
我的理解是每个转向力应单独计算,然后应将所有转向力加在一起然后应用。
据我所知,每个转向力等于特定行为所需的速度,减去代理的当前速度。
我试图结合两种基本行为:寻求和逃离。下面是两个图解说明我的问题。
我有一个直接在它前面寻找目标的特工,并逃离它下方的目标。当药剂静止时(当前速度= 0),每种行为的转向力等于它们各自所需的速度:
vSteer = vDesired - currentVelocity = vDesired - 0 = vDesired
组合的转向力向上和向右指向蓝色。 这大致是我所期待的。
但是,如果代理人正在移动,我们会得到完全不同的结果。为简单起见,假设代理已经在目标方向上以最高速度移动。因此,代理的当前速度等于其所需的搜索速度。
当代理的当前速度等于所需的搜索速度时,搜索转向力为0(vSteer = current - desired = desired - desired = 0)。然后,逃离转向力等于所需的逃逸速度减去当前速度,从而产生向后指向的矢量!并且由于寻道转向力为零,因此总转向力等于逃逸转向力。
我在尝试实施分离力时注意到了这个问题,这实际上是图中所示的情况,但红色的X代表了一个邻近的代理。最终效果是特工保持分离,但是以大约一半的速度移动,寻找转向力指向前方,一个向后指向并远离邻居的逃离转向力,这最终会相互抵消。
看起来逃兵的任何组成部分都不应该指向这里。我误解了什么?
答案 0 :(得分:1)
你不是在误解任何事情;根据{{3}}中给出的逃逸转向力的定义,这种行为是预期的。该定义在与其他行为结合时引入了不合需要的转向速度分量,这显然是您遇到的问题。要解决这个问题,必须改变逃离行为本身。
逃离行为的唯一目标是确保代理人不会朝着目标移动。因此,对于同样期望的结果,可以修改逃逸行为以满足以下约束 - 沿着从代理到目标的向量的速度分量(此后称为半径向量)必须是非正的。原因在于,如果沿半径向量的速度分量为正,则代理与目标之间的距离随着每个时间步长而减小。
在数学上,我们的约束变为:
dot(radius, velocity) <= 0
radius = targetPos - agentPos
。
我们现在必须应用转向力(或更准确地说,冲动力),以确保代理人满足我们的逃离行为约束。为此,转向脉冲成为沿半径矢量的速度分量的负值(以抵消分量)加上一个小的偏差项(注入&#34;动量使得代理进一步远离从长远来看目标)。请注意,如果约束不满足,我们只需要应用转向力。
我们的逃离行为约束算法将如下所示:
radius = targetPos - agentPos
radiusVel = dot(radius, velocity)
if radiusVel <= 0 {
return
}
BIAS = 0.02 // Can be any small value determined after testing
steering = -(radiusVel + BIAS) * radius
实际上,这种逃逸行为约束非常类似于用于解决物理引擎中的碰撞的常规约束。该正常约束与其名称一致,仅在法线方向上施加脉冲,并且不影响切向方向上的速度。具体来说,它不会在&#34;向后&#34;中施加转向冲击。你的例子中的方向。