我正在尝试理解如何实现和组合克雷格·雷诺兹所描述的自主代理的转向向量。
我的理解是,每个转向力应该单独计算,然后所有的转向力应该加在一起,然后应用。
我知道每个转向力都等于特定行为的期望速度减去智能体的当前速度。
我尝试将两种基本行为结合起来:寻找和逃离。下面是两个图表来说明我的问题。

我有一个特工正在寻找它正前面的目标,然后从它下面的目标逃走。当智能体处于静止状态(当前速度= 0)时,每个行为的转向力等于其各自的所需速度:
vSteer = vDesired - currentVelocity = vDesired -0= vDesired
组合的舵力指向右上方,蓝色。这大致就是我所期望的。
然而,如果智能体在移动,我们会得到完全不同的结果。为了简单起见,假设智能体已经在目标方向上以最快的速度移动。因此,智能体的当前速度等于其期望的搜索速度。

当智能体的当前速度等于期望的寻道速度时,寻道转向力为0 (vSteer = current - desired = desired - desired = 0)。然后,逃逸方向力等于期望的逃逸速度减去当前速度,这会产生一个向后指向的向量!由于寻道转向力为零,因此总转向力等于逃离转向力。
我在尝试实现分离力时注意到了这个问题,这基本上是图中所示的情况,但红色的X表示相邻的代理。净效果是智能体保持分离,但移动速度约为一半,寻求转向力指向前方,逃离转向力指向后方和远离邻居,这在很大程度上最终抵消了彼此。
这真的不像是逃离力量的任何组成部分都应该在这里向后指向。我误解了什么?
发布于 2018-04-19 21:06:53
您没有误解任何事情;根据Tuts+ article中给出的逃逸转向力的定义,这种行为是意料之中的。该定义在与其他行为相结合时引入了不希望的转向速度分量,这显然是您正在经历的问题。要解决此问题,必须更改逃离行为本身。
逃逸行为的唯一目标是确保智能体不会向目标移动。因此,对于同样理想的结果,可以修改逃逸行为以满足以下约束--沿着从代理到目标的矢量(以下称为半径矢量)的速度分量必须是非正的。其原因在于,如果沿半径向量的速度分量为正,则智能体与目标之间的距离随着时间步长而减小。
从数学上讲,我们的约束变成:
dot(radius, velocity) <= 0radius = targetPos - agentPos在哪里。
我们现在必须施加转向力(或者更准确地说,脉冲),以确保智能体满足我们的逃离行为约束。为此,转向冲量变成沿半径向量的速度分量的负值(以抵消分量)加上一个小的偏置项(以“注入”动量,以便智能体在长期内进一步远离目标)。请注意,只有在不满足约束的情况下,我们才需要施加转向力。
我们的逃离行为约束算法将如下所示:
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事实上,这种逃离行为约束与用于解决物理引擎中的冲突的正常约束非常相似。该法线约束与其名称一致,仅在法线方向上应用冲量,而不会影响切线方向上的速度。具体地说,在您的示例中,它不会在“向后”方向上应用转向脉冲。
https://stackoverflow.com/questions/49713403
复制相似问题