在不平坦的行星表面上寻路


16

我的问题是在不平坦的行星表面上寻路的最佳方法是什么?


背景资料

我通过位移映射6个球面投影平面创建了一个行星。这些平面在投影为球形之前先形成一个立方体。

在此处输入图片说明

我想知道是否可以将每个“球面投影的立方体面”用作网格并使用简单的A *算法来找到最佳的可能路线,我也希望考虑位移高度,以便该路径避免爬升山脉等(我想这只是A *算法中的一种启发法)。另一个考虑因素是,我通过利用Unity3d的物理引擎实现了行星运动,将重力应用于行星中心。我提出的解决方案是否需要对重力运动进行独立控制。

为了更好地阐明我的问题,这是我目前的行星体:

在此处输入图片说明


2
您可能会对这部来自《行星歼灭》的视频感兴趣。它们似乎与您从一个多维数据集包装世界并在其中寻找路径一样。这并不是一个真正的答案,但是您可以看到他们正在使用A *以及其他一些优化球体路径查找策略。寻路位从24:30开始。
MichaelHouse

@ Byte56感谢您提供此链接,这是一种非常有趣的成本核算方法,迫不及待想看完这款游戏!
Caius Eugene 2013年

Answers:


12

看来您已经回答了自己的问题。A *可能是最好的方法。是的,当然可以按照您描述的方式使用它,包括使用高度信息来避开山脉。只要您能够访问有关世界表面上任何网格的信息,就没有理由不能在A *启发式算法中使用它。

最后,在问题的结尾,您将路径查找与路径跟踪混淆了。路径查找并不关心重力,除非您将其添加为试探法,并且由于您位于行星的表面上,所以重力在整个表面上基本相同。许多游戏都将重力与运动结合在一起,我看不出没有理由。

基本上,我们希望映射从红色到蓝色,使其在球体上与在立方体上相同。

在此处输入图片说明

由于A *经常使其当前节点成为邻居,因此您可以轻松地创建一组函数以获取相邻节点。例如getXPlus()getXMinus()getZPlus()等等。这些函数将采用当前节点,并按照函数名称指定的方向返回该节点。

在大多数情况下,这些功能只能增加一个值并完成,但是在边缘,情况会发生变化。

您将需要将立方体的表面映射到2D坐标系。但是,这取决于您自己,它们不必排队,只需给每个网格空间一个唯一的X,Y坐标即可。

现在,在边缘上并获得相邻的网格空间时,不必只是增加坐标。我们必须找出要移动到的面并切换到该面的坐标。

例如,在这里获取XPlus坐标将同时更改X和Y坐标,因为我们要移到新面上的新网格空间。绿线表示两个面之间的边缘。

在此处输入图片说明

现在,这些只是全局坐标,使用内部局部坐标系统可能会更容易,该坐标系统的第3维代表您当前所在的立方体面。

无论哪种方式,您都需要为多维数据集面上的每个网格空间都具有唯一的坐标。它们之间的遍历将取决于您如何实现坐标系。您还需要知道该坐标在何处映射到球体表面。

所有这些最终都应该被抽象掉,这样您甚至都不知道。


为响应加油。我认为我正在苦苦挣扎的是,每架飞机都是一个孤立的网格。关于如何处理接缝,您是否有任何建议(或进一步阅读),我想我将数学上展示我的“立方体”,合并所有网格并使用该数据集计算路径?
凯斯·尤金

确实,这只是您需要担心的方面。这可以通过包装函数轻松解决(将多维数据集包装在包装函数中,从而包装世界...)。您可以将多维数据集抽象为可以包裹的平面。创建用于获取相邻网格空间的函数,getXPlus()将沿XPlus方向获取网格,无论它位于面之间的边界上都无所谓,该函数将仅切换面并返回适当的网格信息。
MichaelHouse

在折叠的立方体上找到路径的唯一不准确之处是顶点倾斜,因此边缘的长度不同。可能不会在结果路径中产生明显差异,否则您只需考虑长度即可。
danijar

1
这里要了解的重要一点是,A *不一定在平面上运行;它在图形上运行。尽管在每个多维数据集面内,节点都以网格的形式排列和连接,但在多维数据集的边缘也存在节点连接。
jmegaffin

1
@ Byte56感谢您的出色回答,我已经开始提出解决方案,但是遇到了一些障碍。也许我误会了。我在计算器张贴的问题了,因为我觉得它更多的是数学/编程问题stackoverflow.com/questions/16089074/...
凯斯尤金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.