看来您已经回答了自己的问题。A *可能是最好的方法。是的,当然可以按照您描述的方式使用它,包括使用高度信息来避开山脉。只要您能够访问有关世界表面上任何网格的信息,就没有理由不能在A *启发式算法中使用它。
最后,在问题的结尾,您将路径查找与路径跟踪混淆了。路径查找并不关心重力,除非您将其添加为试探法,并且由于您位于行星的表面上,所以重力在整个表面上基本相同。许多游戏都将重力与运动结合在一起,我看不出没有理由。
基本上,我们希望映射从红色到蓝色,使其在球体上与在立方体上相同。
由于A *经常使其当前节点成为邻居,因此您可以轻松地创建一组函数以获取相邻节点。例如getXPlus()
,getXMinus()
,getZPlus()
等等。这些函数将采用当前节点,并按照函数名称指定的方向返回该节点。
在大多数情况下,这些功能只能增加一个值并完成,但是在边缘,情况会发生变化。
您将需要将立方体的表面映射到2D坐标系。但是,这取决于您自己,它们不必排队,只需给每个网格空间一个唯一的X,Y坐标即可。
现在,在边缘上并获得相邻的网格空间时,不必只是增加坐标。我们必须找出要移动到的面并切换到该面的坐标。
例如,在这里获取XPlus坐标将同时更改X和Y坐标,因为我们要移到新面上的新网格空间。绿线表示两个面之间的边缘。
现在,这些只是全局坐标,使用内部局部坐标系统可能会更容易,该坐标系统的第3维代表您当前所在的立方体面。
无论哪种方式,您都需要为多维数据集面上的每个网格空间都具有唯一的坐标。它们之间的遍历将取决于您如何实现坐标系。您还需要知道该坐标在何处映射到球体表面。
所有这些最终都应该被抽象掉,这样您甚至都不知道。