UE的导航网格底层使用的是Recast Navigation,而Recast将网格划分为一个个凸多边形,平时寻路基本上都是使用这些多边形。

/// Defines a polyogn within a dtMeshTile object.
/// @ingroup detour
struct dtPoly
{/// Index to first link in linked list. (Or #DT_NULL_LINK if there is no link.)unsigned int firstLink;/// The indices of the polygon's vertices./// The actual vertices are located in dtMeshTile::verts.unsigned short verts[DT_VERTS_PER_POLYGON];/// Packed data representing neighbor polygons references and flags for each edge.unsigned short neis[DT_VERTS_PER_POLYGON];/// The user defined polygon flags.unsigned short flags;/// The number of vertices in the polygon.unsigned char vertCount;/// The bit packed area id and polygon type./// @note Use the structure's set and get methods to acess this value.unsigned char areaAndtype;/// Sets the user defined area id. [Limit: < #DT_MAX_AREAS]inline void setArea(unsigned char a) { areaAndtype = (areaAndtype & 0xc0) | (a & 0x3f); }/// Sets the polygon type. (See: #dtPolyTypes.)inline void setType(unsigned char t) { areaAndtype = (areaAndtype & 0x3f) | (t << 6); }/// Gets the user defined area id.inline unsigned char getArea() const { return areaAndtype & 0x3f; }/// Gets the polygon type. (See: #dtPolyTypes)inline unsigned char getType() const { return areaAndtype >> 6; }
};

仔细观察这个结构,发现能够自定义的地方有两个,一个是flags,16位,另外一个是areaAndtype,8位,而areaAndtype中使用6位表示area,2位表示type,area是可以用来存储自定义数据的。

在UE中,和导航区域类型有关的有UNavArea。NavArea表示一个区域,导航构建时把区域的类型写入到recast。另外NavArea中还有一个AreaFlags,也会同时写入,这个AreaFlas可以自己定义,默认为1,0表示不可行走。另外,NavigationQueryFilter可以使用这些标志来进行查询,设置在查询时候使用哪些类型或者排除哪些类型。

//
// Use UNavigationSystem.DescribeFilterFlags() to setup user friendly names of flags
//
USTRUCT()
struct NAVIGATIONSYSTEM_API FNavigationFilterFlags
{GENERATED_USTRUCT_BODY()#if CPPunion{struct{
#endifUPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag0 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag1 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag2 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag3 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag4 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag5 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag6 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag7 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag8 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag9 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag10 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag11 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag12 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag13 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag14 : 1;UPROPERTY(EditAnywhere, Category=Flags)uint32 bNavFlag15 : 1;
#if CPP};uint16 Packed;};
#endif
};

另外还有一个NavLink,用来连接不同的区域,使用flags的最高位来表示。

// setting up the last bit available in dtPoly::flags
NavLinkFlag = ARecastNavMesh::FNavPolyFlags(1 << (sizeof(((dtPoly*)0)->flags) * 8 - 1));

如果要查询当前的多边形的区域类型,通过查询多边形的area可以获得areaID,然后就可以获得id对应的UClass。遗憾的是,areaid和flag是和类一一对应的,存储在UClass的default object中,同一个NavArea类对应的多边形的area和flag都是一样的。比如说,在场景中,部署两个NavModifier,修改区域类型为Obstacle,那么在导航时,我可以通过查询多边形来得知当前我在Obstacle区域中,但是却无法得知在哪一个Obstacle区域。

所以如果有类似的需求,要么修改引擎代码,新增字段将额外的信息写入,或者想办法复用16位的flag,或者将额外的信息存储在别处。前两种方法需要改引擎,后一种方法看起来更方便些,比如说可以在导航构建后将不同区域的多边形保存,然后在需要的时候进行查询。

转载于:https://www.cnblogs.com/haisong1991/p/11442816.html

UE4的NavArea,AreaFlags和Recast的dtPoly的关系相关推荐

  1. UE4 C++入门之路1-C++和蓝图的关系和介绍

    C++和蓝图的关系和对比 C++和蓝图的关系 创建C++工程 在UE4中新建一个蓝图类 在UE4中新建一个C++类 C++和蓝图的关系 接触过UE4的应该都听说过,UE4提供了两种方法来设计游戏,C+ ...

  2. 【UE4官方文档翻译】Unreal Engine 4 For Unity Developers (针对Unity开发者的UE4)

    ------------------------------------------------------------------ 说明:       本翻译是参考.修正.整理后的文档.如有错误,请 ...

  3. 虚幻4地形怎么增加层_虚幻周报20200114 | 新春快乐!

    官方知乎号:虚幻引擎 搜集日期:20191230-20200112 整理编辑: 大钊,小辉辉,马古斯,小帅帅 声明:文档搜集来自网上,难免遗漏,请联系我们投稿和添加关注.该文档版权归整理编辑者共同所有 ...

  4. UWA学堂|Unreal课程合集

    Epic Games的虚幻引擎5已经开启体验计划!不知道大家是否已经上手了呢?早在2020年5月,Epic Games通过 "Lumen in the Land of Nanite &quo ...

  5. UE4 开发从入门到入土

    本文仅代表个人观点,与任何组织立场无关. 这是一篇引导性的文章,并不会涉及非常深度的解析,其目的并非全面否定这个引擎,而是在盲目跟风的潮流中让并不是很了解这个引擎的人率先了解这个巨大的引擎中存在的史诗 ...

  6. recast SoloMesh生成过程详解

    最近游戏中需要使用navmesh,阅读recast过程中顺手把学习记录写下来,方便以后查看. 使用过程主要需要理解每个数据含义,至于生成过程,不做深入研究. 相关资料 recast源码 很好的参考资料 ...

  7. 游戏思考17:寻路引擎recast和detour学习二:recast导航网格生成流程\源码剖析流程\局限性,附录计算点线面举例代码

    一.recastnavigation使用介绍 1)模式选择 Solo Mesh:单块生成 Tile Mesh:分块生成 Temp Obstacles:分块并支持动态阻挡 这里测试的话选单块生成 2)模 ...

  8. [unity3d]recast navigation navmesh 导航网格 寻路算法 源码分析

    recast navigation navmesh导航网格算法源码分析 Author:  林绍川 recast navigation navmesh是unity3d ue4内置的寻路算法 本文为了方便 ...

  9. ue4 4.24启动无响应_UE4项目问题集合

    debugeditor模式下,在LoadPackage过程中crash,vs报出Stack overflow的错误 这是由于Package层数过多,vs栈不够用导致的.而ue4用UBT导致不能直接修改 ...

最新文章

  1. parser.add_argument 参数用法 包含metavar
  2. select中option改变时跳转到其他页面
  3. stm32 bootloader跳转
  4. Mysql的基础使用之SQL原生语句的使用:表的 创建 删除 修改 (一)
  5. mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官
  6. salt java 日志 乱码_Saltstack执行cmd.run重启tomcat后出现日志乱码(15)
  7. 除了“团队牛”还有“饭菜香”,百度 IDL 招聘算法实习生
  8. maven 打包java项目_如何使用maven打包java项目?
  9. VC++6遇到的问题(持续更新)
  10. 想做视频号,先纠正一点
  11. markdown图床使用小记
  12. m3u8视频通用下载器
  13. SKLEARN实例:【用随机森林回归填补缺失值】
  14. Docker 图片水印中文乱码显示为方框, 设置Docker容器字体
  15. 香港美食攻略(3)——源记喳咋
  16. ApacheCN 计算机视觉译文集 20210212 更新
  17. MII和mii-tool
  18. 小王利用计算机设计了一个计算程序,小王利用计算机设计了一个计算程序,输入和输出的数据如下表:那么,当输入数据是8时,输出的数据是[]A.B.C.D.-七年级数学...
  19. 如何使用MacVim呢?
  20. 利用Py-Socket模块做的一个不登陆windows服务器自动实现替换或者调用自动拨号功能...

热门文章

  1. Day10 总结:产品开发必备的63个网站和工具
  2. 【嵌入式】AMIC和DMIC(什么是数字麦和模拟麦)
  3. JavaWeb项目--网上商城 (6-1)
  4. 人脸识别之Hog特征+SVM分类器训练与使用
  5. 看成语猜古诗句微信小程序源码/智力考验好玩小游戏
  6. 如何让你的百度网盘下载提速
  7. 树莓派搭建自动追番服务器详细教程|树莓派|Jellyfin|AutoBangumi|qBittorrent
  8. protobuf 归纳
  9. 紫外线消毒水处理设备的杀菌速度快吗?
  10. C++引用的超详细解释及误区纠正,不看后悔哦(上)