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