在《人工智能游戏编程真言》中,有详细的叙述如何建立导航网格,但是却没有一丁点的代码,而且在创建过程中,还有许多细节问题没有解决,在百度文库中有一篇关于AS3建立导航网格的文章,里面也讲的很好,但是那里使用三角形作为节点,这显然对于多边形较多的3D世界不太合适。不过里面的A*寻路算法的相关取值是值得观看的。进行了几个礼拜的编写,导航网格稍微能看我先给几张截图,让大家有个底!可以生成多边形的网格节点,而且可以自动生成相邻连接,支持鼠标直接点选节点并且显示(渲染)其和其有连接的节点,以及加入物体后分裂受影响的节点,以及裁去小面积节点,但是没有3-2合并,在后面会完善。我经过三张地图的测试,感觉还不错
这张图是原网格模型,这里用的是OBJ文件格式模型,可以用3DMAX直接导出,obj文件加载器要自己些,推荐书籍有《DirectX+游戏开发终极指南》,《focus on 3d model》,场景自己用3DMAX制作,这里的场景比较粗陋,但是可以用来测试。
最初直接把全部三角形当作节点加入NavMesh中,这里面就是画出的节点,注意这里不是用线框模式渲染出来的,而是渲染的NavMesh,整个NavMesh包含一个导航节点链表(每个节点包括一个顶点索引数组,指向后面顶点数组的位置,就是这个节点所有顶点的索引集合。还有一个法线索引,主要是为了减小存储空间,就像《真言》里说的),顶点数组(包含顶点位置,还有指向的导航节点的指针的链表,这里可以知道哪些节点包含了此顶点,这个在合并的时候很有用哦,而且真言里也讲了极大的缩小合并时间),法线数组(法线值,因为游戏中,能走的面片法线很多相同的,基本都是指向Y轴)。现在是把你的OBJ模型里面可走(表示面法线值不会很离谱)的三角形,用你的OBJ加载器把纯三角形(只包含位置,DX中要使顶点序为顺时针)一个一个的加到NavMesh中,在加之前判断法线是否过陡或向下的那种,假如法线测试通过,那么在法线数组中查找是否有相近的法线值,并设置法线索引,假如没有那么在法线数组中假如当前法线,并且设置当前节点的法线索引。然后在设置节点的顶点索引