Urho3D导航

Urho3D通过使用Recast和Detour库实现导航网格生成和路径查找。

导航功能通过NavigationMesh和Navigable组件公开。

NavigationMesh从已使用Navigable组件标记的子节点收集几何体。默认情况下,可导航组件的行为是递归的:除非禁用递归,否则也会收集其子节点的几何体。如果可能,首选物理CollisionShape几何体,但仅支持三角形网格、凸包和长方体形状。如果从节点中找不到合适的物理几何体,则使用静态可绘制几何体代替StaticModel和TerrainPatch组件(如果存在)。使用的LOD级别与遮挡和光线投射相同(请参见SetOcclusionLodLevel())。

使整个场景参与导航网格生成的最简单方法是将NavigationMesh和Navigable组件创建到场景根节点。

必须通过调用Build()手动触发导航网格生成。初始构建后,也可以通过为要重建的体积指定一个世界边界框来重建网格的部分,但这不能扩大总边界框大小。一旦构建了导航网格,它将随场景进行序列化和反序列化。

要查询导航网格上起点和终点之间的路径,请调用FindPath()。

要演示导航功能,请查看相关的示例应用程序(15_navigation),该应用程序具有部分导航网格重建(可以创建和删除对象)和查询路径。

导航网格可以使用分水岭或单调三角测量生成。分水岭通常会生成更多多边形,这些多边形会生成更自然的路径,而单调的多边形生成速度更快,但可能会生成不希望的路径伪影。

寻路权重

导航网格的轴对齐框区域可以使用NavArea组件标记为属于特定的“区域类型”。给定区域类型的权重是使用NavigationMesh(或DynamicNavigationMesh)的SetAreaCost(无符号,浮点)方法分配的。

动态导航网格

DetourTileCache库用于提供NavigationMesh的变体,该变体支持添加和删除动态障碍,其代价几乎是内存消耗的两倍。然而,添加和移除障碍物比部分重建NavigationMesh要快得多。

障碍物仅限于由半径和高度组成的圆柱形。添加(或启用)障碍时,DetourTileCache将使用无障碍DynamicNavigationMesh的存储副本重新生成相关的平铺。

无法以障碍物形式表示的更改将需要使用Build()方法进行部分重建,并且与标准NavigationMesh的重建相比没有优势。

在所有其他方面,DynamicNavigationMesh的用法与常规NavigationMesh相同。有关障碍物和DynamicNavigationMesh的用法,请参阅39_CrowdNavigation示例应用程序。

群组导航

除了基本的路径查找之外,其他导航组件使用DetourCrowd库在人群代理之间进行路径查找,并可以添加动态障碍物。这些组件包括DynamicNavigationMesh、CrowdManager、CrowdAgent、NavArea和Obstruct。

CrowdAgent使用SetMoveTarget(Vector3)方法指定的“目标”进行导航。代理将在到达其目的地时停止。要停止正在进行的代理,请将其移动目标设置为当前位置。

CrowdAgent将在不同的情况下启动事件。其中最重要的是CrowdAgentFailureEvent,如果CrowdAgent处于无效状态(例如关闭NavigationMesh)或目标目标不再可通过NavigationMesh访问,则会发送该事件。当CrowdAgent在空间中移动时,它可以使用CrowdAgentStateChanged事件发送有关其当前状态的其他事件,当代理到达目标目标时,该事件将包括CROWD_AGENT_TARGET_ARRIVED状态。

CrowdAgents以不同的方式处理导航区域。CrowdManager可以包含16种不同的“过滤器类型”(0-15),它们具有不同的区域成本设置。这些成本在CrowdManager中使用SetAreaCost(无符号filterTypeID、无符号areaID、浮动权重)方法分配。CrowdAgent将使用的筛选器使用其“SetNavigationFilterType(unsigned filterTypeID)”方法分配给代理。

有关如何使用CrowdAgent和CrowdManager的示例,请参见39_CrowdNavigation示例应用程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘小舟舟,游大世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值