【问题标题】:simple 3d space collision check algorithm简单的 3d 空间碰撞检查算法
【发布时间】:2018-07-02 23:18:23
【问题描述】:

我有一个连续的 3d 空间,由 4 个平面的内部空间定义,这些平面在平行线处相交(无限长的矩形) - 我们称之为“A”。然后在模型中,我有一堆封闭的凸形 3d 形状,它们可能会或可能不会重叠到空间“A”中——让我们称它们中的每一个为“B”。我正在寻找的是一种计算效率尽可能高的算法过程,以破译任何“B”形状是否与“A”重叠。

*每个“B”形状都由它的顶点、边和带有平面的面等定义......以及它们之间的链接。

*如果其中一些没有意义,我可以画一些涂鸦...

到目前为止,我针对“A”检查每个“B”形状的过程如下:

  1. 检查 b 的任何点是否在 A 的所有 4 个平面内 - 如果是 => 重叠(如果它们都落在相同的外部空间 => 不重叠)

  2. 检查 a 的任何平行线是否与 b 的任何面相交 - 如果是 => 重叠。

  3. 检查 b 的任何边是否与 A 的 4 个面中的任何一个相交 - 如果是 => 重叠。

我还想我可以为每个“B”形状创建一个带有中心点和半径的近似边界圆,以首先检查以快速消除远处的“B”形状...

** 对于第 2 部分和第 3 部分,我使用了一个函数来检查边是否与 3d 对象相交。这通过将 2 个点与构成对象的每个平面进行比较,以查看它们是否是相对的两侧,然后如果是,则找到平面交点并检查该交点是否在 3d 对象内。

这似乎可行,但我想看看是否有更好或更快的方法来破解同一个坚果?也许我错过了一些明显的东西......

谢谢

【问题讨论】:

    标签: algorithm 3d geometry collision-detection computational-geometry


    【解决方案1】:

    请注意,对于无限矩形“管”,您可以将问题简化为二维情况:只需将所有点和边投影到平面上,垂直于管。

    现在您必须寻找折线(多边形)与矩形的交点(如果您使用管的母线上的点作为基点和向量,则轴对齐) - 这个任务肯定更简单。

    如果你的形状是凸的,多边形也是凸的,SAT 方法(分离轴定理)非常好(当然,对于形状之间的链接来说这不是真的,它们应该分开处理)。

    【讨论】:

    • 感谢 SAT 方法的建议!我目前在 3d 形状上使用它 - 使用点积将 A 和 B 的点投影到每个法线轴上,并检查 2 个范围是否重叠。还没有尝试投影到 2d 平面上(改变基础)......猜猜这是改变基础所花费的时间和计算 2d 点积与 3d 节省的时间之间的权衡......?
    • 我希望 2d 投影包含的外部边缘少于 3d 面的数量(虽然需要一些工作来显示这些边缘)
    • 你是对的。我天真地以为我必须只比较 3d 中的面部法线...投影到 2d 然后 SAT 方法似乎是最好的方法...谢谢
    【解决方案2】:

    继续 MBo 的回答,您可以通过取顶点的 (2D) 凸包(即凸多边形)来找到 B 形状的有用轮廓。

    http://www.algorithmist.com/index.php/Monotone_Chain_Convex_Hull

    然后应用 Sutherland-Hodgman 裁剪算法,看看是否还有非空交叉点。

    https://en.wikipedia.org/wiki/Sutherland%E2%80%93Hodgman_algorithm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多