将网格转换为图形以进行导航

时间:2014-02-08 11:44:48

标签: c# algorithm unity3d path-finding navmesh

旁注:我不确定这个问题是否属于游戏开发堆栈交换网站 - 但是,我觉得它属于这里,因为上下文是一个游戏,我想要实现的算法本身是公平的应用程序不可知。此外,我不是在寻找高水平的技术,因为我觉得我已经建立了一个,但我正在寻求对某个问题更具体的帮助。无论如何,对于这个问题:

嘿大家好!

我正在开发一款多人游戏,要求服务器可以为服务器控制的实体执行路径查找。服务器是一个直接的C#应用​​程序,客户端使用Unity游戏引擎。在服务器上使用Unity不是一种选择。此外,我想完全避免使用本机库。

我已经检查了Detour的寻路,虽然它们确实有C#端口,但我宁愿拥有自己的实际寻路位实现;因为这个过程非常简单,我希望它能够根据我的需求量身定制,以便与服务器上的现有组件配合使用。

Unity内置了对Recast / Detour的支持。这很好,因为我可以在Unity中使用Recast来生成导航网格;然后使用我自己的路径查找在服务器上使用它。问题是我似乎无法找到一种基于Unity / Recast创建的网格生成图形的正确方法。

我需要做的是在内存中创建一个图形,其中每个节点都是网格中的一个三角形,图形的每个边缘都连接着彼此相邻的两个三角形。

我能从Unity的API中提取的唯一数据是生成的网格的顶点和三角形索引,因此我需要重新构建自己的图形。我的第一个实现只是为每个三角形创建一个节点,如果该三角形与另一个三角形共享另外两个点,则在它们之间创建一个链接 - 形成图形的边缘。

虽然这对大多数网格来说都很有用,但它不足以因为看起来Unity正在吐出可能在区域(多边形)之间有连接(边缘)的网格,即使它们不共享两个顶点。下面是Unity将生成的navmesh叠加到我的关卡几何上的示例(Unity确实将三角形合并为凸多边形,而我的代码没有 - 但是,在任何一种情况下问题仍然存在)

Unity Navmesh

在这个例子中,我生成的图形需要连接由白线分隔的多边形(我找不到任何解释为什么它在Unity中呈现为白色的文档)但由于它们只共享一个单顶点。

我想知道是否有一种有效的算法来检测这些情况。我正在考虑做的是让多边形被认为是连接的:

if (sharedVertexCount == 2)
    connectPolygons()
else if (sharedVertexCount == 1)
    Vector3[] parallelLine = findParallelLineSharedByBothPolygons()
    if (parallelLine != null)
        Vector3 otherPoint = getUnsharedPointInLine(parallelLine)
        if (isPointInLine(parallelLine, otherPoint))
            connectPolygons()

认为这应该有用,但我找不到有效地做到这一点的方法。另外,我对“isPointInLine”实现有点麻烦,因为显然我的数学技能比我想象的更生气。

无论哪种方式,都有是一个更简单的解决方案;然而我在网上找不到任何指向我的方向...这就是为什么我要问你好人们,如果有什么我可以做的就能有效地将生成的导航网格变成连接多边形的图形。无论是帮助我实现isPointInLine还是指向一个更明智的算法的方向,都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

当涉及到寻路时,大多数方法都建议使用专用于导航的预制数据结构,这种结构更容易使用(除非你的图形数据结构足够简单 - 这里不是这样)。

我建议你解决几个问题:

  • 基于体素的导航系统:实现一个体素系统,其中包含三维布尔线(无法通过),并应用一颗星 D星算法就可以了。

  • 知道AI可以通过的路径向量。

  • 两个系统的合并(主路径使用已知的路径向量,而网格签署的体素与false相交。 - 这可能是您正在寻找的解决方案。

答案 1 :(得分:0)

如果我正确理解了您的问题,则基于可见性图的路径规划算法可以为您提供帮助:

提示是从现有的多边形地图中提取图形,当节点彼此直接可达时,节点就连接在一起。然后,可以将得到的所谓的可见性图(参见https://en.wikipedia.org/wiki/Visibility_graph)用于常规的最短路径算法(https://en.wikipedia.org/wiki/Shortest_path_problem)进行导航。

现有许多算法可以有效地提取可见性图以进行路径规划。以下是一些相关链接:

A thesis describing the general procedure and a few tweaks in chapter 4.4

My python package for visibility based path planning

Open source C++ library for 2D floating-point visibility algorithms, path planning

Paper about Lee's algorithm

C implementation of Lee's algorithm