可见性路径规划
July 30, 2021About 2 min
可见性路径规划
我不知道翻译是不是对的,英文是:Visibility Graph Path Planning,简称:VGAPH。
是什么
我们从实际问题出发,如下图,当我们在游戏中需要使一个角色自动从start点移动到goal点并且绕开障碍物,蓝色为障碍物。

我们第一个想到的使用的方法就是寻路,那么我们说的VGAPH就是一种寻路的策略。
为什么
我们常见的寻路方案中,需要在角色移动或者是在规划路线时检测物理碰撞,从而找到顺畅通过的路线。检测碰撞也是一个比较耗时的工作,如果使用不当的话。 VGAPH这个寻路的方案是直接跳过碰撞检测。
怎么用
可见性图(Visibility Graph)将导航问题转化为图搜索问题:
- 节点:起点、终点,以及所有障碍物多边形的顶点。
- 边:若两个节点之间的连线不穿过任何障碍物(即相互"可见"),则在二者之间添加一条边,边权为欧氏距离。
- 路径搜索:在构建好的图上运行 Dijkstra 或 A* 算法,求得从起点到终点的最短路径。
由于两点间最短路必然沿障碍物顶点折行(直线段不会无故绕弧),因此可见性图上的最优路径就是环境中的全局最短无碰撞路径。路径会紧贴障碍物的角,这也是其最显著的视觉特征。
实现
构建步骤:
- 收集所有障碍物多边形的顶点,加入起点与终点,共
个节点。 - 对每对节点做可见性检测(线段与所有障碍物边求交),可见则加边。暴力检测的复杂度为
( 为障碍物边数总量),优化算法(如旋转扫描线)可降至 。 - 在图上运行 A*(以欧氏距离为启发值)或 Dijkstra,输出最短路径点列。
复杂度与局限:
- 图的构建为
(节点数)到 (含可见性检测),预处理开销较高。 - 路径紧贴障碍物角,在实际游戏中常需做平滑后处理(如 String Pulling / Funnel 算法)。
- 适合静态障碍物场景;若障碍物频繁变动,需重建图,实时性较差。
- 对于动态环境或大规模地图,通常改用 NavMesh 或分层路径规划方案。
参考
https://lis.csail.mit.edu/pubs/tlp/collision-free-planning-cacm.pdf
http://ntur.lib.ntu.edu.tw/bitstream/246246/200704191001565/1/01389835.pdf
https://github.com/christopher-boustros/Unity-Visibility-Graph-Path-Planning-Simulation