人们将如何为3D世界生成导航网格?


11

我正在尝试找到此问题的解决方案。我正在尝试以一种锁定为x,y地板坐标的顶点网格的形式构建导航网格,并以3D空间的正方形的形状。但是我在尝试找出解决方法时遇到了问题。

我尝试查看Recast库。这是一种非常健壮的方法,但是随着较大的地图和开放空间,它显然会变慢。我也不知道它们如何通过高度图为世界空间生成顶点和边缘。

我的下一个想法是做虚幻引擎3曾经做过的事情。

https://udn.epicgames.com/Three/NavigationMeshReference.html

使用光线投射生成网格。我不知道如何停止射线广播。

所以...我的下一个选择是包装盒,可能是包装盒。创建一个细分的体积,其大小为2的幂。将框与网格对齐,然后向下射矩形棱镜作为射线。如果它落在作为地面一部分的几何图形上,并且矩形未相交,则在此处保留正方形。并继续向下直到达到音量范围。为了检查是否需要链接边,我想我可以检查一下两对顶点之间的坡度是否在可行走坡度之内,如果为真,请合并它们。

我的主要问题是...这似乎不是最佳选择。不用考虑,多层过程的估计过程为O(N ^ 3)。哪个会变得很讨厌。

最后一点是用于自动创建这些正方形的矩形组。我不太确定该怎么做。虚幻实现通过斜率将它们分开。但是,我试图保持网格格式。因此,这并非完全必要。问题仍然在于创建较大的矩形图块以将路径查找过程拆分为每个图块的基础。磁贴不能太大也不能太小。

所以问题是...

生成此网状导航网格的有效方法是什么?制作图块的好方法是什么?


您预计何时生成网格?编译时,加载时还是实时?我们为同样的问题而苦苦挣扎,最终认为这对于我们的场景(在没有重叠路径的自上而下的射击游戏中生成加载时间)是过大的,我们决定采用基于四叉树的方法。这对我们来说足够好了。所以我想我要问的是,您真的需要这个吗,或者最简单的解决方案可以满足您的最初要求,因为这可能会浪费时间。如果您确实找到了一个好的解决方案,我很想听听您如何解决它。
尼尔斯

@Niels我计划进行预构建,然后将其加载到游戏中。
moonshineTheleocat

这样,时间消耗就不会成为最初的缺点,因为玩家不会等待它。工作正常后,您始终可以进行优化。
尼尔斯

您的水平有多大?我们使用大型游戏重铸并没有问题-你只需要调整TIIE值等
史蒂芬

我认为您缺少“困扰”的地方。这与重铸使用的图块不太一样。我试图弄清楚如何重用重铸来做这样的事情。但这主要是一场噩梦。
moonshineTheleocat

Answers:


1

基本的3D世界可以由可以在大多数游戏引擎中方便构建的导航网格表示。Actor可以沿着多边形的边缘移动。

那将是一个简单的解决方案。有很多算法可用于查找路径和生成导航网格。

我想分享一下我之前读过的东西。

范例01

这描述了一种可能的解决方案,在该解决方案中,我们可以将游戏世界分解成正方形。每当将正方形方块添加到游戏中时(当玩家靠近某个区域/程序地形时),都会添加一个正方形方块。但是,我们不必再计算整个导航网格。我们只为该图块计算它,并将其添加到现有图形中。那里的性能显着提高。

示例02

解决的下一个问题是上一个示例中的锯齿状运动。我可以理解,通过考虑将来的转向并概括方向,可以大大减少锯齿形运动,并使运动流畅。带有详细动画的游戏不会遗漏任何内容,但是您可以在一些开放世界游戏中注意到这一点,在这些游戏中,我认为导航大部分是烘焙的。

至于问题,我建议您在导航网格生成算法列表中查看Kromster的答案

另请查看示例中的“剩4人死亡”的AI系统。涵盖了更多有趣的主题

祝好运。


0

有很多方法,为什么不只是将其放置在玩家身上,还是制作一个跟随玩家的小网格,并在每个交叉路口下检查其可横向移动,例如那里是否有地板并进行射线投射以查看是否存在即将到来的一面墙/建筑物。


一个好主意,但不是实现最终目标的可行方法。我需要支持一个广阔的世界,并允许AI从一个大陆的一侧导航到该大陆的另一侧。这样就可以了,但是我需要有一个固定的导航网格来生成更高的节点。
moonshineTheleocat

0

这是我到处都看到的问题。诀窍是“分离关注点”。“说什么?”,我听说你在想。屏幕上显示的不是“数据结构”。使视觉与数据分离以构造视觉非常重要。发行新的基础软件版本时,这样做始终可以“证明您的游戏”。

建立一个代表游戏世界的数据结构(又称:模型)。然后构造数据结构模型的“视图”。如果要将世界从棋盘格网格更改为六边形网格,则数据结构(模型)保持不变,但显示内容将“绘制”(渲染)不同的视图。


4
通常,分离关注点确实是一种好的做法,但目前的答案是针对特定于回答问题的细节(即,如何从给定的一组世界几何中生成合适的基于网格的寻路模型)。你是对的,无论这个模型是什么,它都应该与用于绘制关卡的数据分开,但是要回答这个问题,我们仍然需要一种方法来生成这个寻路模型。
DMGregory

-2

制作一个双数组。然后,如果一个或多个对象不可通过,请使用方法告知数组位置不可通过。当AI尝试移动时,他们将查看double数组,看看它是否可以通过。


4
填充此数组的方法很困难。;)
DMGregory
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.