• 基于导航网格的A星寻路(Navigation mesh)


    最近花了几个月的时间实现了导航网格寻路和导航网格自动生成。

    □导航网格数据结构定义

        由于数据之间有着层级关系,所以采用XML进行定义。
        navmesh基本元素:顶点(Verts)+可走边(Edges)+凸多边形(Polys)

    □导航网格寻路

       1.以凸多边形为节点,以可走边为relation,进行A星寻路。

       2.寻路结果使用LOS算法进行路径平滑,其中视线采用Z轴横切面而不是直线来实现。

       3.寻找凸多边形。先使用八叉树进行空间划分,然后根据点跟AABB盒相交进行查找。

    □导航网格自动生成

       主要是提供

       1.Cleaner:合并重复的顶点(即焊接顶点)、删除共线情况、删除没有用到的顶点、删除没有的poly(即删除不规范、删除面积过小)、重置顶点ID和Poly ID。

       2.MergingPolys:合并多边形,包含对相同边进行合并和32合并。

       3.PolygonClipping:多边形剪切,地形数据必须是三角网格(若不是,可以使用Triangulate三角化)。输入障碍物后,使用包裹法(Jarvis步进法)进行构造凸多边形,然后再对各个三角网格进行剪切操作。

        4.Triangulate:三角化。

        5.GeneratingEdges:生成边操作。

        6.Deleter:删除指定顶点、删除指定poly、删除指定Edge

        7.BoudingBoxCreater:障碍物的输入可以使用AABB盒,但只对有连接关系的三角网格进行生成包围盒,如一座桥上的两个栅栏,必须为它生成2个AABB盒,而不能只生成一个。

        8、NavMesh:导入、导出、遍历操作等
        9、Poly:遍历操作、顶点删除操作等

    截图:

    1、(未路径平滑)

    image

    2.路径平滑后

    image

    所花时间:0.412872 ms(跟网格数量有关)

     

    参考资料:

    1. 焊接顶点,《3d数学基础:图形与游戏开发》14.4.2节

    2. 32合并, 《人工智能游戏编程真言》里面有一篇 “4.3 建立接近最优的导航网格”专门介绍如何建立 基于导航网格的3d寻路,4.3.6节。

    3. http://www.ai-blog.net/archives/000152.html

    4.生成边: http://www.terathon.com/code/edges.php

    5.根据点生成三角网格,delaunay算法, http://www.travellermap.com/tmp/delaunay.htm

    http://local.wasp.uwa.edu.au/~pbourke/papers/triangulate/

    6.几何操作:《计算机图形学几何工具算法详解》

    7. 。。。。。

  • 相关阅读:
    电脑右边小键盘默认解锁
    linux关机、重启命令
    linux下Qt设置全屏后再设置指定大小失效
    关闭QEventLoop阻塞失效
    Qt将中文转换成unicode字符串
    vue 中使用vuex和localStorage保存登录状态
    git使用
    jdk11下载与安装
    Navicat安装
    类不平衡问题的评价指标的计算
  • 原文地址:https://www.cnblogs.com/tuzhiye/p/1835899.html
Copyright © 2020-2023  润新知