recastnavigation,recast用法

Recast Detour是一个开源寻径引擎,符合zlib协议,基本上是免费的,可以无限制地作为个人和商业产品使用。

从名字中可以看出,这个引擎分为两个部分:

第一部分是Recast的主要功能是将场景网格模型生成用于寻路网格模型(Navigation Mesh)。 生成的寻径网格模型当然比原模型简单得多,这也提高了实时寻径算法的效率。

第二部分是Detour的主要功能,利用上一步生成的Navigation Mesh进行寻路。 它包括多个路径搜索算法,可以根据路径的流畅度和路径搜索时间效率的要求进行不同的选择。

有关导航消息的信息,请参见:

Anavigationmesh,ornavmesh, ianabstractdatastructureusedinartificialintelligenceapplicationstoaidagentsinpath-findingthroughlargespaces.meshesthathatdonndonnnnntice vironmentthattheymodel, offertheadditionaladvantagethatagentswithaccesstothemeshwillnotconsidertheseobstaclesinpath-finding iducomputationaleforting nbetweenagentsandstaticobstaclesmoot.meshesaretypicallyimplementedasgrasgradt.ingcomingcomicomicomicomplenticomplente

oneofthemostcommonusesofanavigationmeshisinvideogames,todescribethepathsthatacomputer-controlledcharactercanfollow.itisustion

References[edit]

‘ navigationmeshreference ‘.retrieved 2012-12-16.此地址介绍详情) )。

RecastDetour本身是一个独立的库,源代码中的Demo用于SDL库。

简单媒体播放器SDL )是一个开源的跨平台多媒体开发库,用c语言编写。 SDL提供了几个用于控制图像、声音和输入/输出的函数,因此开发人员只需使用相同或相似的代码,就可以跨多个平台Linux、Windows、MacOSX等)进行APP应用程序目前,SDL多用于开发多媒体APP应用程序,如游戏、模拟器和媒体播放器。

广泛用于许多著名的游戏。 最有名的游戏是获得Linux集团游戏开发大奖的文明。 权利的呼唤Civilization:CallToPower )。

SDL包含用于调用OpenGL的函数。

SDL的编译还需要DirectX

建立NaviMesh的过程sample _ solo mesh :3360 handle build ) )。

一.填写build的配置结构体rcConfig

二.光栅化输入的polygonsoup 网格? )

a )创建体素高级域rcheightfield rcallocheightfield,rcCreateHeightfield

b )创建用于存储三角形的索引缓存m _ tri areas=newunsignedchar [ NTR is ];

c )基于斜坡搜索可以行走的三角形并光栅化它们: rcMarkWalkableTriangles,rcRasterizeTriangles

三.可过滤面

删除突出故障rcfilterlowhangingwalkableobstacles

删除棚状突起rcFilterLedgeSpans

删除玩家无法站立的区域rcFilterWalkableLowHeightSpans

四.可分面为简单多边形

a )缩小高度域并加速rcAllocCompactHeightfield,rcBuildC

ompactHeightfield

b) 根据可走半径腐蚀可走区域:rcErodeWalkableArea

c) (可选)标记凸多边形区域:对于每个getConvexVolumes:rcMarkConvexPolyArea

d) 分割高度域(heightfield)以可用简单算法来三角化可走区域。有三种分割算法可选:

1) Watershed partitioning

  – the classic Recast partitioning

  – creates the nicest tessellation

  – usually slowest

  – partitions the heightfield into nice regions without holes or overlaps

  – the are some corner cases where this method creates produces holes and overlaps

     – holes may appear when a small obstacles is close to large open area triangulation can handle this)

     – overlaps may occur if you have narrow spiral corridors i.e stairs), this make triangulation to fail

  * generally the best choice if you precompute the nacmesh, use this if you have large open areas

rcBuildDistanceField,rcBuildRegions

2) Monotone partioning

  – fastest

  – partitions the heightfield into regions without holes and overlaps guaranteed)

  – creates long thin polygons, which sometimes causes paths with detours

  * use this if you want fast navmesh generation

rcBuildRegionsMonotone

3) Layer partitoining

  – quite fast

  – partitions the heighfield into non-overlapping regions

  – relies on the triangulation code to cope with holes thus slower than monotone partitioning)

  – produces better triangles than monotone partitioning

  – does not have the corner cases of watershed partitioning

  – can be slow and create a bit ugly tessellation still better than monotone)

    if you have large open areas with small obstacles not a problem if you use tiles)

  * good choice to use for tiled navmesh with medium and small sized tiles

rcBuildLayerRegions

五、跟踪并简化区域轮廓

rcAllocContourSet,rcBuildContours

六、通过轮廓创建多边形网格(Mesh)

rcAllocPolyMesh,rcBuildPolyMesh

七、创建细节网格(允许访问每个多边形的近似高度)

rcAllocPolyMeshDetail,rcBuildPolyMeshDetail

 

(至此,Navigation Mesh数据rcPolyMesh已经生成完毕)

八、(可选)从Recast网格创建detour数据

填写dtNavMeshCreateParams结构

创建NavMesh数据:dtCreateNavMeshData

分配Mesh结构:dtAllocNavMesh

初始化Mesh:

status = m_navMesh->initnavData, navDataSize, DT_TILE_FREE_DATA);

(recastnavigation-master\RecastDemo\Source\Sample_SoloMesh.cpp第355行开始)

 

 

在建立了NavMesh之后的寻路过程

 

通过dtNavMeshQuery::findNearestPoly寻找起止点的多边形引用。

此后有多种ToolMode可作为寻路方式:

但每种寻路方式都会先调用寻找多边形路径的算法dtNavMeshQuery::findPath,该方法的输入为起始的多边形引用和起始点的位置(用来计算遍历花费,y坐标影响结果),输出为一条以多边形引用为节点的路径。

注意:如果终点多边形不可达,那么最后一个多边形则为距离终点最近的多边形。如果用来存储结果的数组太小而不足以容纳所有路径多边形,那么这个数组将被填充从起始多边形到终点多边形的最远距离。也就是说,能填多少个就填多少个,但不够存储最后几个多边形了。

enum ToolMode

{

TOOLMODE_PATHFIND_FOLLOW,

TOOLMODE_PATHFIND_STRAIGHT,

TOOLMODE_PATHFIND_SLICED,

TOOLMODE_RAYCAST,

TOOLMODE_DISTANCE_TO_WALL,

TOOLMODE_FIND_POLYS_IN_CIRCLE,

TOOLMODE_FIND_POLYS_IN_SHAPE,

TOOLMODE_FIND_LOCAL_NEIGHBOURHOOD,

};

TOOLMODE_PATHFIND_FOLLOW

迭代的向前,每次前进一小步,直到到达终点或用于存储光滑路径的buffer用完为止。

TOOLMODE_PATHFIND_STRAIGHT

寻找直的路径,也叫“string pulling”就是拉线方法。

TOOLMODE_PATHFIND_SLICED

从代码中没看明白具体是怎样的方法,TODO:在程序中看。

TOOLMODE_RAYCAST

该方法用于快速的短距离检测。

TOOLMODE_DISTANCE_TO_WALL

 

TOOLMODE_FIND_POLYS_IN_CIRCLE

 

TOOLMODE_FIND_POLYS_IN_SHAPE

 

TOOLMODE_FIND_LOCAL_NEIGHBOURHOOD

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注