我正在 Unity3d 中制作游戏,我需要一种寻路算法,可以在 3d 表面上引导敌人走向玩家。问题是 3d 表面可以采用任何形状,因此它可以是 3d 球体、立方体、环面和更多形状。
我尝试使用 A*,但对于该公式,我需要两点之间的距离,并且由于物体是弯曲的,我无法轻易得到它。我发现如果是球体,则可以使用半正矢公式,但这不适用于环面或随机 3d 形状。
我想要这种结果,除了每种对象: https://www.youtube.com/watch?v=hvunNq7yVcU
有没有一种方法/算法可以用来获得该结果。我知道有一种叫做导航网格的东西,但我需要自己编程。我也找不到导航网格如何解决这个困境。我将使用对象的三角形作为节点。
所以我的问题归结为:
有人知道适用于任何 3D 表面的寻路算法吗?
提前致谢。
我认为你的问题是你没有使用graph,我建议你研究一下关于如何创建图表的教程,如果可以的话,针对你正在使用的语言,(这也可能有帮助在这里他们使用边来连接他们的节点,如果你有多个权重,这是需要的)。如果你确实制作了一个图表,你将需要一个节点类。每个节点必须包含指向它所连接的任何节点的指针以及某种 ID。在您的情况下,这可能是您所需要的,但如果您还有用于连接节点的边缘类(节点之间的连接器),也可以为每次移动分配权重。如果你有一个边类,你的节点将有指向边的指针而不是其他节点,并且每条边将有一个权重和一个指向 1 或 2 个节点的指针(取决于它是否是有向路径)。您还可以创建一个图形类来包含所有节点和边。
总结: 创建一个节点类并确定是否需要边缘类(如果所有内容的权重均为 1,则可以不用它)。使用节点类创建一个图表来表示地图,其中每个图块都是一个带有指向连接图块的指针的节点。使用 A* 或 dijkstra 算法搜索图以找到最短路径。
注意:您会发现的大多数示例都是二维图,您的示例没有什么不同,只是您的示例没有边界,您只需将节点连接到其相邻的图块即可。
你终于得到算法了吗? 如果您不需要精确的最短,那么您可以通过以下步骤进行粗略计算:
如果对象是闭合的,将其切成两半,使其都打开,并且两个点都应属于其中之一。
使用调和贴图技术将开放的 3D 网格压平到平坦的表面。现在,两个点都将位于平坦的表面上,因此您现在可以画一条直线,这是最短的距离。 对于平面中的每条边,在其与最短线相交的位置,在原始 3D 网格上找到相应的交互位置...显然,网格密度越高,结果就越准确。
测量映射的曲线长度,您将获得最佳结果