【问题标题】:Tracing the movement of an AABB into a polyhedron追踪 AABB 到多面体的运动
【发布时间】:2014-08-24 03:17:47
【问题描述】:

假设您有一个 AABB(Axis-Aligned Bounding Box...基本上是一个长方体)。你也有一个多面体(一个未定义形式的凸面形状 - 它可以是任何东西,一个长方体、一个球体、一个胶囊,你所知道的只是组成它的平面列表)。

现在假设这个 AABB 是一个 移动 对象。事实上,它正在以光速移动。然而,多面体是不可移动的。 AABB 直接向多面体射击,我们需要知道它到底停在哪里(它在与多面体接触时立即停止。)

有一个很明显的计算方法:把运动切成一堆小块,一点一点地向前走,然后停在它与多面体相交的点之前的点。但这是缓慢且不准确的。

有一种方法只能在 2D 中可行:取 minkowski 差(从另一个对象中减去一个对象的所有点),从中计算一个凸包,然后将一条线跟踪到框中。不幸的是,在 3D 中,凸包是一个非常密集的计算,并且不能针对每个静态多面体对世界中的每个移动对象进行真正的计算,即使通过快速计算的广泛检查也是如此。

所以问题是......计算这个的正确方法是什么,它可以以完美或接近完美的精度工作,并且可以在任何距离上工作?

我的方法(标记为 2D 的方法)是否是正确的方法,只是在我的端实施不佳?有没有更好的方法?

我正在使用 C#,尽管这个问题对于任何语言都应该是相同的。

这是一个 3D 问题,但这里有一个 2D 图表来帮助理解这个想法:

【问题讨论】:

  • 平面是否定向?也就是说,对于定义多面体的每个平面,您是否有(或者您可以轻松计算)一个垂直于该平面并指向多面体内部的向量?
  • 比如,我是否知道平面的哪一侧指出,哪一侧在里面(并且有与之相关的法线向量)?是的!我愿意。
  • 2D 有这个很棒的代码:gamedev.stackexchange.com/questions/29479/…,但它不容易转换为 3D。

标签: math language-agnostic physics game-physics


【解决方案1】:

让我们将 AABB 视为另一个无聊的多面体,M(用于移动)。 它正朝着多面体S(表示静止),沿着矢量 T(用于旅行)。

有两种可能:

  1. 一个多面体的角穿过一个小面刺穿另一个多面体。
  2. 多面体的边或面是平行的,并沿它们的表面相互影响。

第二种情况可以忽略,因为它意味着一个或多个角会影响 同时。

首先,每个多面体只有有限数量的平面可以参与 在碰撞中。对于M,只有与T点积的平面是 积极的。对于S,只有与T的点积为负的平面。找到所有这些飞机并保留它们,我们将它们称为碰撞参与飞机。

然后,找到M的所有角的坐标,并表示出来 作为时间的函数,t。 (xM_0 在时间 t 的坐标, {{M_0}_x}^t = T_x * t + {{M_0}_x}^0等)

找到 M 的角之一经过的最小 t 通过 S 的所有参与碰撞的平面,您将 知道 M 何时第一次穿透 S。 (这是标准的linear programming problem。)

最后,重复最后两步,但将“静止的”S移向M, 沿 T 向后(使用负“时间”,t)。在消极时期, 最大的 t,其中 S 的一个角已通过所有 M 的碰撞参与平面将是影响时间。你可以 翻转上面的标志,与移动 M 得到的 t 进行比较,然后 取最少的一个。那将是影响的时间。你可以插那个 到 M 的坐标中找出确切的位置。

而且由于 M 实际上是一个 AABB,所以你可以很快地重建它 并且从坐标无损。

(我还没有实现这个。如果有不清楚的部分,请告诉我。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2017-03-26
    • 1970-01-01
    • 2020-04-13
    • 2014-08-05
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多