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

时间:2013-03-13 06:45:06

标签: c# xna path-finding raycasting

我试图在我的游戏中实现点击移动,但此刻我很难知道如何选择网格的一部分让玩家走路。

所以我所做的就是在我的游戏中有一个导航网格,我可以从中选择点,但我想要做的是能够实时选择导航网格,并能够告诉玩家在哪里继续导航网格,我怎么能实现这个目标呢?

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

如何实时点击导航网格点?

由于

1 个答案:

答案 0 :(得分:1)

声明;我自己还没有使用过导航网格。但我认为它会起作用:

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

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],则子节点为:

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返回true([0,-100,0]到[100,100,100])
  • n1有自己的孩子,所以我们也将它们相交。 n0返回true([0,-100,0]到[50,100,50])
  • n1 / n0没有子节点,因此我们检查其列表中的62个对象,并返回那些与范围球相交的带边界/框的对象。

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

所以交叉测试从999到70.这是进步:)