【问题标题】:Triangle to triangle collision detection in 3D3D 中的三角形到三角形碰撞检测
【发布时间】:2011-01-18 00:17:00
【问题描述】:

我了解 2 个三角形之间的三角形到三角形碰撞检测。 有人可以解释我如何将它与由 1000 个顶点组成的 3D 对象一起使用吗? 如何为每个网格创建三角形列表? 我必须接受顶点的每一个排列吗? 这将导致 O(n^3) 我觉得非常糟糕。

我如何概括这一点?

我需要从格式中读取数据。如果一切都失败了,有人可以建议一种从三角形制作网格的格式吗?我还需要格式的网格目录,至少对于初学者来说是这样。

非常感谢。

【问题讨论】:

  • 这里面有很多问题,应该单独提出,而不是集中在一个问题中。通常,您要使用的“3d 对象”不仅仅是 point cloud,它通常是 polygon mesh 和/或一组 3D 曲线。如果您真的从点云开始,那么您可能需要查找旨在从点云创建多边形网格的算法,然后再进一步进行网格->网格重叠检测。
  • 一旦你有了一个多边形网格,你就会开始应用 Gareth/James 所说的优化,以避免将一个网格中的每个三角形与另一个网格中的每个三角形进行比较。正如您的问题似乎暗示的那样,它永远不会是可以从每个网格的所有顶点创建的每个 possible 三角形。但是网格中的每个三角形 -> 另一个网格中的每个三角形仍然很慢,这就是您进一步优化的原因:)

标签: collision-detection


【解决方案1】:

您可以应用许多优化来检测网格之间的碰撞:

  • 空间分区,如 James 所述。

  • 使用bounding volumes 提前拒绝。例如,球体-球体碰撞很便宜,所以在测试网格 A 和 B 是否碰撞之前,您可能会查看 A 周围的球体是否与 B 周围的球体发生碰撞。如果球体未命中,显然网格无法碰撞,所以没有需要测试它们。不同种类的物体可能需要不同种类的包围体:轴对齐的长方体和圆柱体很常见。

  • 缓存见证。在某些碰撞测试中,您最终会计算碰撞的“见证”,例如,当您应用 separating axis test 时,您会计算分离轴。如果轴在时间 t 将两个对象分开,它可能会在时间 t + δ 继续将它们分开,因此缓存您找到的轴并尝试下一次是第一次(参见 Rabbitz,Graphics Gems IV 中的“移动凸多面体的快速碰撞检测”)。

【讨论】:

    【解决方案2】:

    http://en.wikipedia.org/wiki/Binary_space_partitioning

    BSP 树是检查静态网格碰撞的一种非常有效的方法,但它确实需要对网格进行一些预处理以确保没有三角形相交。它通过将网格划分为半空间来工作。这使得碰撞检查和物理更容易。

    编辑:

    我觉得我也应该提到八叉树。与 BSP 树的一般思想相同,但它将模型划分为递归更小的立方体而不是半空间。

    http://en.wikipedia.org/wiki/Octree

    在回答您的第二个问题时,您可能正在寻找类似 .obj 文件格式的内容。

    http://en.wikipedia.org/wiki/Wavefront_.obj_file

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多