我如何使用三角形拾取来确定三角形在世界空间坐标中的确切位置

本文关键字:三角形 坐标 空间 位置 世界 何使用 | 更新日期: 2023-09-27 18:03:33

我试图在我的游戏中执行点和点击移动,但目前我对如何选择玩家行走的网格部分感到困惑。

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

我认为三角形选择可能是一种方法来确定我选择的网格与鼠标取消项目,但我认为我需要一点比这更准确,不是吗?

我如何实现点和点击导航网格在实时?

谢谢

我如何使用三角形拾取来确定三角形在世界空间坐标中的确切位置

免责声明;我自己还没用过导航网格。但是我认为它应该是这样工作的:

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

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

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

如果你的网格基本上是平的,你也可以使用一个虚构的平面。这大大简化了这一点,因为你可以得到一个3d位置,你可以搜索最近的导航点,而不是射线来检查交集。

在3D中进行选择的另一种方法是有一个离屏幕的渲染目标,每个可选择对象绘制一个特殊的颜色。然后你只需要检查你点击了什么颜色然后在字典里查一下。但我不知道这在导航网格中是如何工作的。

编辑(四叉树);在这种情况下,四叉树基本上是一种按位置分配游戏元素的方法。通常它们与轴对齐,并围绕世界原点([0,0,0])定位。它们所做的基本上是根据元素在x-z平面上的象限将元素列表分成4个。我们称这些为节点。因此,如果你要查找与[10,0,15]上的元素接近的元素,你需要在列表中查找属于象限[>0,*,>0]的节点。

当你的节点在它们的列表中有很多对象时,你将它们再次分成4个。所以如果你的节点是[0,- 100,0]到[100,100,100],子节点将是:

0: [0,-100,0] to [50,100,50]
[50,-100,0]至[100,100,50]
N2: [0,-100,50] to [50,100,100]
N3: [50,-100,50] to [100,100,100]

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

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

  • 创建一个半径为10的BoundingSphere
  • 交叉测试4个顶层节点。n1返回true ([0,-100,0] to [100,100,100])
  • n1有自己的子节点,所以我们也将它们相交。n0返回true ([0,-100,0] to [50,100,50])
  • n1/n0没有子对象,因此我们检查其列表中的62个对象,并返回那些具有与range-sphere相交的边界球体/框的对象。

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

交叉测试从999到70。