0

我试图在我的游戏中实现指向和点击运动,但目前我很难为我如何选择网格的一部分供玩家步行。

所以我所做的是我的游戏中有一个导航网格,我可以从中选择点,但我想要做的是能够实时选择导航网格并能够告诉玩家去哪里导航网格,我该如何实现?

我认为三角形选择可能是一种方法来确定我用鼠标 unproject 选择网格的位置,但我认为我需要比这更高的准确性,不是吗?

如何实时实现指向并单击导航网格?

谢谢

4

1 回答 1

1

免责声明;我自己还没有使用导航网格。但我认为它会像这样工作:

我猜你应该在某种数据结构中拥有这个网格,使空间搜索变得容易(四/八叉树)。然后,您将从鼠标指针沿相机投射光线。

https://gamedev.stackexchange.com/questions/26106/screen-space-to-world-space

然后,您在网格中进行搜索,使用数据结构来减少需要检查的点数。

如果您的网格基本上是平的,您也可以只使用一个虚构的平面。当您获得一个 3d 位置时,这极大地简化了这些操作,您可以搜索最近的导航点而不是检查与之相交的射线。

在 3D 中进行选择的另一种方法是使用屏幕外渲染目标,每个可选对象都会向其绘制特殊颜色。然后,您只需要检查您单击的颜色并在字典或其他内容中查找。不过,不知道这将如何与导航网格一起使用。

编辑(四叉树);在这种情况下,四叉树基本上是一种按位置在游戏中分配元素的方式。通常它们是轴对齐的,并位于世界原点 ([0,0,0]) 周围。他们所做的基本上是根据它们存在于 xz 平面上的世界的哪个象限,将您的元素列表分成 4 个。我们称这些节点。因此,如果您寻找一个靠近 [10,0,15] 处的元素的元素,您将在列表中查找属于象限 [>0,*,>0] 的节点。

当您的节点在其列表中获得大量对象时,您再次将它们拆分为 4 个。因此,如果您的节点是 [0, -100, 0] 到 [100, 100, 100],则子节点将是:

n0: [0,-100,0] 到 [50,100,50]
n1: [50,-100,0] 到 [100,100,50]
n2: [0,-100,50] 到 [50,100,100]
n3: [50 ,-100,50] 到 [100,100,100]

所有节点都有一个 BoundingBox,您可以使用它来检查交集以确定是否应该继续在节点内搜索。

案例:Object@[20,10,20] 想要在一个世界中找到 10 个单位内的对象,其中 1.000 个对象分布在 [-100,-100,-100] 到 [100,100,100] 之间;

  • 在半径为 10 的位置周围创建一个 BoundingSphere。
  • 交叉测试 4 个顶级节点。n1 返回真([0,-100,0] 到 [100,100,100])
  • n1 有自己的孩子,所以我们也与他们相交。n0 返回真([0,-100,0] 到 [50,100,50])
  • n1/n0 没有子对象,因此我们检查其列表中的 62 个对象并返回那些具有与范围球相交的边界球/框的对象。

这样,我们搜索 62 个对象的列表,而不是 1.000 个对象。为了将相交检查的次数减少 937(无论如何我们都不会检查对象本身),我们只需要进行 8 次相交测试;所有顶级节点 (4) 和 n0 的子节点 (4)。

所以相交测试从 999 到 70。这就是进步 :)

于 2013-03-13T07:35:30.100 回答