当前位置: 首页 > news >正文

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示例应用程序。

http://www.lryc.cn/news/14430.html

相关文章:

  • 【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)
  • 车载技术开发—{Android CarFrameWork}
  • 多城市二手车买卖发布管理小程序开发
  • 企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件
  • 37、基于51单片机乒乓球比赛系统设计
  • VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题
  • centos误删python2后怎么重新安装
  • Qt 开发使用VSCode 笔记2
  • 查找算法复习
  • 腾讯前端必会面试题(必备)
  • 探访上汽通用武汉奥特能超级工厂
  • 【Linux】线程函数和线程同步详细整理(金针菇般细)
  • Python学习笔记6:抽象
  • 自己手写一个redux
  • mysql调优参数
  • JavaEE简单示例——再插入的同时获取插入的主键列
  • sql语句练习
  • 广州蓝景—结合chatGPT下的教育模式变化
  • 大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——shuffle机制
  • 4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|第3章:无线传感器网络通信-3.1协议结构 3.2物理层|青岛科技大学|课堂笔记
  • 关机时,如何控制systemd服务的关闭顺序
  • 关于MySQL镜像构建过程中添加自动初始化数据库
  • CS144-Lab2
  • Linux内核驱动之efi-rtc
  • Java 字符串
  • 麦克风阵列波束基本概念理解
  • JAVA保姆式JDBC数据库免费教程之02-连接池技术
  • 视频片段怎么做成gif图?快试试这2种方法
  • 2.20计算机如何工作
  • [golang gin框架] 5.Cookie以及Session