UE4中寻路网格技术探索(NavMeshBoundsVolume)

[复制链接]
查看18131 | 回复26 | 2017-1-10 15:55:23 | 显示全部楼层 |阅读模式
本帖最后由 天才小熊猫 于 2017-1-11 09:19 编辑

转自博客:https://syxblog.com

Hello,我又回来了,今天本猫带来的是关于UE4中NavMeshBoundsVolume寻路网格的一些技术经验分享,源自于黄老师的一些问题,所以稍微深入探讨了下这个寻路体积。接下里我们先来认识下这个寻路体积
英文名字叫NavMeshBoundsVolume,在UE4控制面板,Volumes下,他的主要作用是给予AI或者一些其他智能物体做寻路用的,还有个叫NavModifierVolume的,是用来做寻路体积的修正,用简单的话讲就相当于是个裁剪功能。文档里没有针对这里着重介绍,但是我实际做项目时候发现了一些问题,所以专门写一篇这个文章来分享下经验。

先来新建一个场景,添加到场景里寻路体积,右边世界大纲里就会出现这个体积的东西,但是我们发现现在按下P键,P是显示寻路导航体积覆盖面的显示和隐藏功能。按下P后我们发现场景中并没有绿色。
此时我们需要构建一次路径,构建路径前提是先要把光照构建了。当然你是动态光照就不用构建了。我这里方便演示我就用动态光好了。

构建后我们发现了2个事情。

一个就是被网格覆盖的地方会变成绿色,而在世界大纲会产生一个该寻路网格默认的设置。这个设置我们等下讲,先来看下如果场景存在多个寻路网格,可以自动合并地图的绿色区域。

然后这里都是没问题的,如果我们使用官方这几个地图的话,是会有绿色区域,但是我们自己MAX里面或者一些地方创建出来的模型到UE4中,放进去,给一个寻路网格,会发现没有反应,比如这样。

这个是因为模型的碰撞以及寻路体积的设置问题。首先我们先来设置下模型的碰撞。
首先模型的碰撞类型默认就可以,Default,blackall也可以,然后我们打开模型,进入模型的预览界面。

我们点开这个按钮,会发现此时模型是没有碰撞的,如果一开始你是自动生成碰撞建议删除,或者在MAX里面做一个比较完美的碰撞,那我这里为了从0开始讲,我就把模型碰撞一开始都删除了。
好了没有碰撞,我们先来分析下这个模型,首先这个模型是带有一个斜坡的,也就是说其实这个模型结构是分为3个部分。

来看下结构,从红色线条知道,一共分为了5个段落,这里再说一下,如果是MAX里做好了碰撞忽略我这里讲的。
分为5段,我们先简单一点来弄,还是在这个模型编辑器里,选中顶部的Collision,添加一个BOX Collision,添加后发现会是一整个包裹模型,我们刚才说了要分成5段,所以这里要选中刚才添加的碰撞体,然后缩放和调整他的大小。

然后我们多添加几个,直到样子大概是模型的形状。

我这里拼了一层,上面那一层是一样的,但是说到这里肯定人就开始骂我了,所以这个自己拼的方法也不是不可以,但是为了方便演示,UE4这里面还有一个自动根据模型来生成碰撞的。
我们把这些自建的都删了。

选择顶部Collision中的上图选项。

在弹出这个面板上,我们选择精度以及最大可以获取的点,这个最大获取的点我可能说的不对,他的意思就是说当我是一个多边形的时候,精度越大,需要跟随模型自身去做自适应的碰撞体,那对于多边形来讲这个最大可以存在的点的数量,当然越大精度越高了,这里我们2个选项先选择一半好了,先不管那么多了,需要好的还是MAX里做碰撞好了。

大概就是这样样子,作为测试嘛,我们先这样子用啦。
那我们在场景里选择显示碰撞的类型会看到是这样的。

这样模型这一块的改动就做完了。那接下来我们来调整下寻路网格的属性。
那么如果不想针对每个改变的话,可以在项目设置中的NavigationMesh里去改变。但是我这里就只拿场景里会自动生成的RecastNavMesh-Default来修改了,每一个NavMeshBoundsVolume都可以产生一个独立的属性,世界大纲里看到得名字就是RecastNavMesh-Default了。
那RecastNavMesh-Default的细节面板里其实有很多复选框,我们暂时只关心Generation生成选项中的这些参数。

这里面着重几个重要的讲好了。
Tile Size UU,这个不好说,我按照我的意思来解释一下,这个东西是产生一个叫区域的东西,也就是说他的大小影响新进入NavMesh的影响区域。
Cell Size和Cell Height是控制在区域内,或者叫这个导航区域的一个生成尺寸与默认的高度,改变尺寸,则影响导航区域产生的位置,改变高度,则影响默认导航路径的起始高度。我这里将高度和尺寸改为最小为1,这他会按照最低的这个模型尺寸来匹配。
Agent Radius、Agent Height、Agent Max Height,第一个是用来控制实体的区域半径、或者叫距离,第二个就是实体的高度,第三个就是最大高度,后面2个好理解,第一个如果改成10或者更大,则代表从当前这个物体所在寻路网格内,从物体本身向外的半径是多大,相当于给他包裹了一层壳,这里我改成0,因为我想要获得一个更精确的计算值。而后面2个高度,如果是0,则该区域会生成双层的寻路路径,改成0首先会贴近地面是一层寻路路径,同时在物体上也会生成,当AI通过时,会直接穿过去,或者卡在下面不动,因为按照路径,下面绿色部分也是会通过。就像如图一样,正确的是上面,错误的是下面。Agent Radius也负责2个寻路网格的距离合并值。


Agent Max Slope则负责如果你包含有倾斜的路面,这个倾斜的值是多少,细心地人会发现上面的路径,有一个台面是没有的,因为那里的斜率很大,所以要改变这里的数值。我就稍微给大点什么40啊50的。
那Agent Max Step Height和上面有一个参数的一样,也是代表Agent Max Slope最大的数值是多少。
Min Region Area与Merge Region Size控制的最小区域面积与新NavMesh的合并面积。
Max Simplification Error则是控制生成在物体上的区域,最大的误差是多少,因为我们可以发现如果改为0,则几乎吻合碰撞体的边缘,数值越大,区域简化的形状越大,精度越低。
然后我们通过调整后可以得到一个比较正确的寻路对象的状态。

好了就写到这里,主要是讲解一下寻路体积的一些使用方法和对于一些异形模型无法正确识别的一些参数设定。


个人博客 : ericsong.org
zhaishengfu | 2017-1-10 16:32:37 | 显示全部楼层
小猫猫,大智慧
回复 支持 反对

使用道具 举报

Song | 2017-1-10 17:07:00 | 显示全部楼层
请问一下,如果我要做一个空中寻路,空中会有障碍物,怎样让我的AI 绕过障碍物,去寻找Target呢
如下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复 支持 反对

使用道具 举报

Eric_Song | 2017-1-10 17:11:46 | 显示全部楼层
fusong1234 发表于 2017-1-10 17:07
请问一下,如果我要做一个空中寻路,空中会有障碍物,怎样让我的AI 绕过障碍物,去寻找Target呢
如下图:
...

改Agent Height参数吧
个人博客 : ericsong.org
回复 支持 反对

使用道具 举报

__________ | 2017-1-10 21:26:19 | 显示全部楼层
版主,调用ai move to被阻挡了怎么解决,比如8个单位同时移动到某个单位,理想情况是包围住该单位,但是实际一旦被阻挡ai就不动了,怎么解决
回复 支持 反对

使用道具 举报

Eric_Song | 2017-1-11 09:21:28 | 显示全部楼层
不明白这个阻挡是被地形物件阻挡还是被其他AI阻挡还是一开始能移动过去从A移动到B点后再从B到C不动。
个人博客 : ericsong.org
回复 支持 反对

使用道具 举报

__________ | 2017-1-11 10:00:05 | 显示全部楼层
天才小熊猫 发表于 2017-1-11 09:21
不明白这个阻挡是被地形物件阻挡还是被其他AI阻挡还是一开始能移动过去从A移动到B点后再从B到C不动。 ...

ai相互阻挡,理想的形成8面包围,但是实际操作只有最先到达的两三个紧贴目标,其他的都傻站着
回复 支持 反对

使用道具 举报

Eric_Song | 2017-1-11 10:22:11 | 显示全部楼层
那这个是行为树的问题了吧
个人博客 : ericsong.org
回复 支持 反对

使用道具 举报

mxlhy | 2017-1-11 10:22:20 | 显示全部楼层
学习了,谢谢楼主分享
回复 支持 反对

使用道具 举报

Song | 2017-1-11 10:43:56 | 显示全部楼层

要是地面到空中距离很大,AI移动设置为Flying, 只是改这个参数行么?
还有麻烦问一下,那如果我在空中有一个类似于FPS游戏中的管道地形(类似于空调管道),里面有很多转弯,空间不大,只能够一个character通行,进入了入口,自动寻路到出口,这样NAVMESH还行吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则