1.5 到达和离开

SeekFlee行为类似,这些算法背后的思路运用的是同样的原理,然后当满足某个条件时,即要么接近于它的终点(到达),要么远离一个危险点(离开),把功能扩展到agent自动停止的位置点。

准备工作

我们需要分别为ArriveLeave算法创建一个文件,并且要记得设置它们的自定义执行顺序。

操作步骤

ArriveLeave使用相同的方法,但是在实现方面,成员变量的名称也随着GetSteering函数前半段的计算值的改变而改变:

1. 首先,使用成员变量实现Arrive行为,以定义停止(目标)和减速的半径:

2. 创建GetSteering函数:

3. 定义GetSteering函数的前半段,这里根据半径变量计算出到达目标点的距离所需要的速度:

4. 定义GetSteering函数的后半段,这里设置steering值并根据最大速度确定steering值:

5. 实现Leave类,修改成员变量的名称:

6. 定义GetSteering函数的前半段:

7. GetSteering函数的后半段与Arrive类的相同。

运行原理

在计算出前进方向之后,接下来的计算基于两个半径的距离,以便知道什么时候加速,什么时候减速,什么时候停止,这也是为什么我们有多个if语句。在Arrive行为中,当agent还很远时,我们全速前进,在快接近半径距离内时就渐渐地减速,并最终在足够接近目标时停止。相反的思路可用于Leave行为,如图1-1所示。

图1-1 Arrive和Leave行为的可视化参考