THREE.js - 尝试从点击生成的矢量 3 中获取对象的最近点(矢量 3)

THREE.js - Trying to get nearest point (Vector 3) of object from click-generated Vector 3

我正在开发一款点击式测试游戏,通过研究和寻找其他关于这个或那个的堆栈溢出答案,我取得了很大进展,但这是我第一次做不到似乎找到与我的问题相关的任何内容。

我的计划是将 PatrolJS 实现到我的项目中以进行寻路,看来在解决此问题后让它工作应该没有任何问题。我的场景中有我的环境以及一些 NPC 角色。我有 3d 中的鼠标交互 space 能够 select 并存储有关单击内容的数据。我可以将我的角色移动到点击位置。我相信我的问题将出现在将点击注册到寻路区域中。

这是我的问题的直观表示:

在这里,您可以看到我的环境简化为一种颜色,以及我当前为我的导航网格区域定义的区域。玩家将能够点击 3d environment/NPC 等的任意位置来与环境中的 with/view/use 元素进行交互。该点击已经起作用,返回 3d space 中与 mouse/ray 相交的点,并向我提供有关我定义的点击元素的任何信息。

我需要一些指导的是,如何才能将单独的导航网格对象上最接近的点返回到在环境对象中单击的点?假设我点击了其中一张表格的某个部分。我希望能够在 navmesh 对象上找到绝对最近的 Vector 3 点。这样,如果有人与可导航区域之外的元素进行交互,我仍然可以定义一个端点并将其提供给 PatrolJS。

给定一个由 n 个三角形和一个点 p 组成的网格,您可以在 O(n) 中使用蛮力找到从网格到 p 最近的点,算法如下

  • 对于属于网格的每个三角形 t
    • p 投影到 t 定义的平面上,设 proj 为该点
    • 如果proj位于t上那么它是离p最近的点,存储从projp
    • 的距离
    • 如果 proj 位于三角形之外,则计算三角形 3 条边中每条边到 proj 最近的点,存储这些点中的每一个点到 p 的距离
  • 总的答案是离p
  • 最近的点

THREE.js Demo