Python 移动点和移动线段的碰撞位置和时间(连续碰撞检测)
我正在研究一个2D碰撞器系统,该系统将形状分解为一个可能的基本体:由两点定义的不可穿透段。为了为该系统提供碰撞检测,我使用静态碰撞检测方法,每帧计算一个线段的边缘与当前处理的线段之间的距离(点/线距离)。如果距离太小,则会在该帧期间触发碰撞。这工作正常,但如果一个或多个物体表现出高速,则存在已知的隧道问题。因此,我正在修补替代品 现在我想介绍对动态点/动态段进行操作的连续碰撞检测(CCD)。我的问题是:我不知道怎么做。我知道如何在两个移动点(一个移动点和一个静态段)之间进行连续碰撞,但不知道如何在一个移动点(由点P定义)和一个移动段(由点U和V定义,两者都可以完全自由移动)之间进行CCD 我曾在SO和其他平台上看到过类似的问题,但并不是针对这些确切的要求:Python 移动点和移动线段的碰撞位置和时间(连续碰撞检测),python,collision-detection,game-physics,solver,symbolic-math,Python,Collision Detection,Game Physics,Solver,Symbolic Math,我正在研究一个2D碰撞器系统,该系统将形状分解为一个可能的基本体:由两点定义的不可穿透段。为了为该系统提供碰撞检测,我使用静态碰撞检测方法,每帧计算一个线段的边缘与当前处理的线段之间的距离(点/线距离)。如果距离太小,则会在该帧期间触发碰撞。这工作正常,但如果一个或多个物体表现出高速,则存在已知的隧道问题。因此,我正在修补替代品 现在我想介绍对动态点/动态段进行操作的连续碰撞检测(CCD)。我的问题是:我不知道怎么做。我知道如何在两个移动点(一个移动点和一个静态段)之间进行连续碰撞,但不知道如何
- 点和段都在移动
- 段可以旋转和拉伸(因为U和V可以自由移动)
- 两帧之间需要准确找到碰撞时间和碰撞点(CCD,无静态碰撞测试)
- 如果可能的话,我更喜欢数学上完美的解决方案(无迭代近似算法,扫描体积)
- 注意:由于U、V点的自由度()
- 注意:使用扫描体积测试进行碰撞测试是不准确的,因为与多边形的碰撞点并不意味着实际移动中的碰撞点(,一旦实际线段穿过该点的轨迹,该点将离开多边形)
- sP(帧开始时的P)
- eP(框架末端的P)
- sU(帧开始处的U)
- eU(框架末端的U)
- sV(帧开始时的V)
- 电动汽车(车架末端的电动汽车)
- 点P是点的起始位置
- 点L1,L2是线端点的起点
- 向量V1表示单位时间内的点(沿绿线)
- 向量V2,V3用于单位时间内的线端
- u是单位时间
- A是点(蓝色),而B和C是线端点(红色)
a+bi==sqrt(a^2+b^2)来解决问题)
其中i
是虚数)
另一个解决方案
所以我探索了其他的选择
最简单的方法有一个轻微的缺陷。它将返回截取时间。但是,必须验证这一点,因为它在截取线路时也将返回截取时间,而不是线段BC
因此,当找到一个结果时,您可以通过将找到的点和线段的点积除以线段长度的平方来测试它。请参见函数isPointO