两个凸多面体的3D连续碰撞检测

时间:2019-04-15 09:15:50

标签: algorithm computational-geometry

对于碰撞检查,我需要计算两个凸多面体相交的时间(如果其中一个沿直线移动)。目前,我有:

  1. 输入:凸多面体定义为一个对象A的一组点及其移动方向。
  2. 输入:凸多面体定义为第二个对象B的一组点
  3. 计算两组C|C| = |A| * |B|的点的Minkowski总和
  4. 使用QuickHull计算C的三角凸包
  5. 线与凸包的三角形相交,并存储沿线的最小和最大距离。

这一切都可以,但是很慢。尤其是计算三角凸包的步骤。

我想知道是否有一种更快的方法可以根据这些点集来计算射线凸多面体交点,而无需计算三角凸包。如果有帮助的话,我可以将输入作为平面(平面方程)。

1 个答案:

答案 0 :(得分:0)

通过分离轴定理解决:

  1. 输入:凸碰撞体积既是点又是平面方程
  2. 对于两个碰撞体积中的每个平面,当每个平面成为一个分离平面(另一个碰撞体积的顶点都在该平面的前面)时,沿移动方向计算return NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return <Widget>[ SliverAppBar() ]; }, body: Hero( tag: 'test', child: Container( padding: EdgeInsets.fromLTRB(16.0, 20.0, 16.0, 16.0), child: Builder(builder: (context) { var handle = NestedScrollView.sliverOverlapAbsorberHandleFor(context); print('test'); return Container( . // whatever you want to return here child: Text('test'), ); print('test'); }) ), ), );
  3. 没有分隔平面时计算shift的间隔。可以通过跟踪遇到的最小值和最大值来就位。

与原始解决方案相比:

  • 理论复杂度从shift降至O(N log N),其中O(N)
  • 工作到位-没有内存分配