Artificial intelligence 联合转向力

Artificial intelligence 联合转向力,artificial-intelligence,game-physics,Artificial Intelligence,Game Physics,我试图理解如何实现和组合Craig Reynolds所描述的自治代理的引导向量 我的理解是,每个转向力应单独计算,然后所有转向力应相加,然后应用 我知道每个转向力等于特定行为的期望速度减去代理的当前速度 我试图结合两种基本行为:寻找和逃离。下面是两个图表来说明我的问题 我有一个探员在它正前方寻找一个目标,然后从它下方的目标逃跑。当代理处于静止状态(当前速度=0)时,每个行为的转向力等于其各自的期望速度: vSteer=vDesired-currentVelocity=vDesired-0=vD

我试图理解如何实现和组合Craig Reynolds所描述的自治代理的引导向量

我的理解是,每个转向力应单独计算,然后所有转向力应相加,然后应用

我知道每个转向力等于特定行为的期望速度减去代理的当前速度

我试图结合两种基本行为:寻找和逃离。下面是两个图表来说明我的问题

我有一个探员在它正前方寻找一个目标,然后从它下方的目标逃跑。当代理处于静止状态(当前速度=0)时,每个行为的转向力等于其各自的期望速度:

vSteer=vDesired-currentVelocity=vDesired-0=vDesired

组合转向力指向上方和右侧,蓝色。 这大概是我所期望的

但是,如果代理移动,我们会得到完全不同的结果。为了简单起见,假设代理已经以最高速度朝目标方向移动。所以代理的当前速度等于其期望的搜索速度

当代理的当前速度等于所需寻道速度时,寻道转向力为0(vSteer=当前-所需=所需-所需=0)。然后逃逸转向力等于所需逃逸速度减去当前速度,从而产生一个指向后方的矢量!由于寻道转向力为零,总转向力等于逃逸转向力

我在尝试实现分离力时注意到了这个问题,这基本上是图中所示的情况,但红色的X表示相邻的代理。最终的效果是代理保持分离,但以大约一半的速度移动,搜索方向力指向前方,逃离方向力指向后方并远离邻居,这在很大程度上最终会相互抵消


看起来逃离力的任何部分都不应该指向后面。我误解了什么?

你没有误解任何事情;根据中给出的转向力定义,这种行为是预期的。该定义在与其他行为相结合时引入了不需要的转向速度分量,这显然是您遇到的问题。为了解决这个问题,必须改变逃跑行为本身

逃跑行为的唯一目标是确保代理不会朝目标移动。因此,为了获得同样理想的结果,可以修改逃逸行为以满足以下约束条件——沿从代理到目标的矢量(以下称为半径矢量)的速度分量必须为非正。其原因在于,如果沿半径向量的速度分量为正,则代理与目标之间的距离会随着每个时间步而减小

从数学上讲,我们的约束变成:

dot(radius, velocity) <= 0

事实上,此逃离行为约束与物理引擎中用于解决碰撞的法线约束非常相似。此法线约束与其名称一致,仅在法线方向上应用脉冲,而不影响切线方向上的速度。具体来说,在您的示例中,它不会在“向后”方向上应用转向脉冲。

我认为您不应该从每个单独的组件中减去当前速度。这也是我最初的想法,但我在这方面读到的所有内容都明确表示您是。请看这里:具体地说,doSeek的实现,大约在页面的四分之一处,返回所需的速度。subtract(host.getVelocity())问自己,“如果有两个所需的速度,为什么答案会不同,而一个是这两个速度的总和?”
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