Algorithm 三维二元空间的实/空叶划分

Algorithm 三维二元空间的实/空叶划分,algorithm,binary-tree,collision-detection,raycasting,trimesh,Algorithm,Binary Tree,Collision Detection,Raycasting,Trimesh,我最近开始研究用于实时碰撞检测的BSP,现在正在研究改进我的解决方案的性能 我实现的系统与wikipedia()上的解决方案非常相似,其中每个节点都包含位于节点超平面上的三角形,并引用位于超平面两侧的两个节点 BSP生成伪代码: Node generate_bsp(Trimesh mesh) Trimesh back, front Node node(mesh[0]) // Generates the plane position and normal of the node loop (Tri

我最近开始研究用于实时碰撞检测的BSP,现在正在研究改进我的解决方案的性能

我实现的系统与wikipedia()上的解决方案非常相似,其中每个节点都包含位于节点超平面上的三角形,并引用位于超平面两侧的两个节点

BSP生成伪代码:

Node generate_bsp(Trimesh mesh)
Trimesh back, front
Node node(mesh[0]) // Generates the plane position and normal of the node
loop (Triangle tri : mesh)
   if (onPlane(tri, node))
      node.triangles.add(tri)
   else if (inFront(tri, node))
      front.add(tri)
   else if (Behind(tri, node))
      back.add(tri)
   // Not fully in front or behind means that the triangle is found on both sides
   // and needs to be split
   else
      Triangle[] trisSplit = tri.split(node)
      loop (tri2 : trisSplit)
         if (inFront(tri2, node))
            front.add(tri)
         else if (Behind(tri2, node))
            back.add(tri)

node.nodeBack = generate_bsp(back)
node.nodeFront = generate_bsp(front)

return node
Bool ray_intersect_bsp(Vector rayPos, Vector rayDir, Node* BSP)
if (BSP == null)
   return false

if (onPlane(rayPos, node))
   if (ray_intersect_triangles(rayPos, rayDir, BSP->triangles))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeFront))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeBack))
      return true
else if (inFront(rayPos, node))
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeFront))
      return true
   if (ray_intersect_triangles(rayPos, rayDir, BSP->triangles))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeBack))
      return true
else
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeBack))
      return true
   if (ray_intersect_triangles(rayPos, rayDir, BSP->triangles))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeFront))
      return true

return false
这意味着对于光线投射,我迭代从前到后排序的超平面,并确定我的光线是否击中每个超平面上找到的任何三角形

BSP光线投射伪代码:

Node generate_bsp(Trimesh mesh)
Trimesh back, front
Node node(mesh[0]) // Generates the plane position and normal of the node
loop (Triangle tri : mesh)
   if (onPlane(tri, node))
      node.triangles.add(tri)
   else if (inFront(tri, node))
      front.add(tri)
   else if (Behind(tri, node))
      back.add(tri)
   // Not fully in front or behind means that the triangle is found on both sides
   // and needs to be split
   else
      Triangle[] trisSplit = tri.split(node)
      loop (tri2 : trisSplit)
         if (inFront(tri2, node))
            front.add(tri)
         else if (Behind(tri2, node))
            back.add(tri)

node.nodeBack = generate_bsp(back)
node.nodeFront = generate_bsp(front)

return node
Bool ray_intersect_bsp(Vector rayPos, Vector rayDir, Node* BSP)
if (BSP == null)
   return false

if (onPlane(rayPos, node))
   if (ray_intersect_triangles(rayPos, rayDir, BSP->triangles))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeFront))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeBack))
      return true
else if (inFront(rayPos, node))
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeFront))
      return true
   if (ray_intersect_triangles(rayPos, rayDir, BSP->triangles))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeBack))
      return true
else
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeBack))
      return true
   if (ray_intersect_triangles(rayPos, rayDir, BSP->triangles))
      return true
   if (ray_intersect_bsp(rayPos, rayDir, BSP->nodeFront))
      return true

return false
然而,该系统要求使用射线三角形交点确定,这是一个昂贵的过程。更糟糕的是,您迭代的三角形很有可能被光线错过,这会导致在找到trimesh上最近的命中之前需要执行相对大量昂贵的光线投射


我可以使用什么方法来优化我的BSP结构和遍历?

你好,Patrick,谢谢你对我的问题发表评论。我不能提供比我已经给出的更多关于我当前实现的信息,因为这样做需要我在文章中添加大量信息。但是,如果你认为这是一个明智的决定,我可以将我关于查找有关我想要查找的信息的源的请求更改为一个解释如何生成这样一个BSP树的请求。从技术上讲,这可能是一个主题,但你的建议是一种形式的。通过专注于您尝试的解决方案,您可以任意限制答案,不建议您可能没有考虑过的实现所需性能目标的替代方法。通过提供您当前的实现,您可以帮助其他人避免重复您已经完成的工作,也可以接受其他有效的方法。我已经根据XY问题改写了我的问题,并提供了描述当前实现背后总体思想的pseucode(我做过一些优化,这里没有介绍,选择一个更优化的三角形来形成每个节点的基础,并放弃肯定会错过的交点)我认为你更新后的问题看起来不错,我已经收回了我的投票。希望有更熟悉这个算法的人现在能够找到你的问题。如果没有,当你的问题在几天后有资格获得赏金,而你仍然没有收到答案时,请在这里随意点击我的评论,我可以为你添加赏金欧。非常感谢你,也感谢你提供的赏金,我们希望这不是必要的。你好,帕特里克,感谢你对我的问题发表评论。我不能提供比我已经提供的更多关于我当前实施的信息,因为这样做会要求我在帖子中添加大量信息。但是如果你认为是这样的话It’这是一个明智的决定,我可以将查找有关我想要查找的信息的来源的请求更改为解释如何生成这样一个BSP树的请求。从技术上讲,这可能是一个主题,但您的建议是一种形式。通过专注于您尝试的解决方案,您可以任意限制建议的答案您可能没有考虑过实现所需性能目标的ernate方法。通过提供您当前的实现,您可以帮助其他人避免重复您已经完成的工作,也可以接受其他有效方法。我已根据XY问题重写了我的问题,并提供了描述RIBE描述了当前实现背后的总体思路(这里没有介绍我所做的一些优化,即选择一个更优化的三角形作为每个节点的基础,并放弃肯定会错过的交点)我认为你更新后的问题看起来不错,我已经收回了我的投票。希望有更熟悉这个算法的人现在能够找到你的问题。如果没有,当你的问题在几天后有资格获得赏金,而你仍然没有收到答案时,请在这里随意点击我的评论,我可以为你添加赏金非常感谢你,也感谢你提供的赏金,希望没有必要。