疏散模型:如何让被拒入多边形拥堵节点的行人永久绕行?
疏散模型行人绕行拥堵区的解决方案
针对你遇到的行人切换出口后仍途经拥堵区的问题,可通过以下几种方式实现绕行逻辑:
1. 在拒入事件中给行人添加路径规避规则
在拥堵节点的On enter denied事件中,直接让被拒行人将该拥堵区标记为路径规避对象,强制其计算路径时避开该区域:
// 获取当前被拒的行人 Ped currentPed = (Ped) getAgent(); // 添加对拥堵多边形节点的路径规避 currentPed.addPathAvoidance(yourCongestionNode); // 取消原前往exit1的动作 currentPed.cancelCurrentAction(); // 切换至前往exit2的GoTo块 goToExit2.take(currentPed); // 强制行人重新规划路径 currentPed.getNavigation().replan();
说明:yourCongestionNode需替换为你创建的拥堵区多边形节点名称,goToExit2是指向次近出口的GoTo块名称。
2. 调整GoTo块的路径计算策略
打开指向exit2的GoTo块属性面板,找到Path calculation选项,设置为Always recalculate path。这能确保行人切换目标后,不会沿用之前缓存的途经拥堵区的路径,而是实时重新计算最优绕行路线。
3. 基于自定义参数限制行人进入拥堵区(备选方案)
如果路径规避效果不佳,可通过自定义参数永久限制被拒行人进入拥堵区:
- 先给行人代理添加布尔类型参数(如
avoidCongestion,默认值false) - 在拥堵节点的
On enter denied事件中添加:((Ped)getAgent()).avoidCongestion = true; - 修改拥堵节点的Allowed to enter条件,在原容量检查基础上追加:
node.getNumberOfAgents() < 7 && !((Ped)agent).avoidCongestion
这样被拒过的行人后续会被永久拒绝进入该拥堵区,自然会选择绕行路线。
内容的提问来源于stack exchange,提问作者SA_2003
相关产品推荐
相关产品推荐

