复杂的寻路算法

时间:2016-04-26 11:37:27

标签: c++ path-finding unreal-engine4

我正在为3D游戏编写一个系统,允许摄像机在节点网络之间传输。

在我的项目中,我编写了一个代表节点的类。与二进制节点类不同,每个节点只能有一个父节点,但允许拥有任意数量的子节点。 使用我的真正令人惊叹的绘画技巧,我开发了一个代表这些节点网络的图像:

在这个例子中,"根节点"是红色,黄色路径最短,蓝色路径最长 这里要注意的重要一点是,实际 子节点的数量并不重要 ,而是增加了路径的长度他们之间。因此,在计算最短路径时不需要启发式算法,因为最短路径将具有最小的组合长度。

那你怎么写一个递归函数来遍历这棵树,然后返回最短的路径呢?

更新

与我的绘画技巧一样惊人,我觉得它并没有完全说明我的问题,也许需要更详细的解释...

首先,这是针对3D世界空间中的相机系统。世界将充满一堆这些节点,相机将被放置在其中一个节点上。允许玩家向任何方向看,但如果不在给定方向上单击鼠标则无法移动。一旦发生点击事件,光线投射就会朝着他面向的方向射出,检索他与X之间的距离{{1}}之间的节点列表。这里的目标是找到与他相连的最远节点,然后是到达那里的最短路径......

所以第一个问题实际上是检查最远的"击中"实际上,节点的可达速度比下一个最接近的" hit"节点。最远的节点可能包含一个实际更长的路径,而不是直接在它前面的节点,所以我还需要一些方法来检查它。所以有一个目标,但目标可以更改为更接近的节点,使事情变得更加复杂。

是的,虽然节点可能只有一个父节点(如上所述),但这个"树"实际上应该可以从任何方向遍历,从网络中的任何节点,将玩家当前所处的节点视为" root"节点

2 个答案:

答案 0 :(得分:2)

Dijkstras算法会为您修复它。您需要向系统提供图表:每个节点有多少节点,谁是每个节点的邻居,每个连接的权重等等。只需查看即可。我刚才这样做了,它就像一个魅力。它找到了任何两个节点之间的最短路径,如果你稍微调整一下(我必须调整我在当时发现的内容),它会告诉你要遵循的节点/路径是什么。然而,我错过了油漆技巧

一些实施版本HERE

答案 1 :(得分:1)

我想你想要代表你的3D世界是一个空间中可访问点的图表。忘了树,它们只是图的特例。 然后看看Dijkstra的算法。如果你需要提高效率,请查看A *,这是对Dijkstra的改进。