Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 移动点和移动线段的碰撞位置和时间(连续碰撞检测)_Python_Collision Detection_Game Physics_Solver_Symbolic Math - Fatal编程技术网

Python 移动点和移动线段的碰撞位置和时间(连续碰撞检测)

Python 移动点和移动线段的碰撞位置和时间(连续碰撞检测),python,collision-detection,game-physics,solver,symbolic-math,Python,Collision Detection,Game Physics,Solver,Symbolic Math,我正在研究一个2D碰撞器系统,该系统将形状分解为一个可能的基本体:由两点定义的不可穿透段。为了为该系统提供碰撞检测,我使用静态碰撞检测方法,每帧计算一个线段的边缘与当前处理的线段之间的距离(点/线距离)。如果距离太小,则会在该帧期间触发碰撞。这工作正常,但如果一个或多个物体表现出高速,则存在已知的隧道问题。因此,我正在修补替代品 现在我想介绍对动态点/动态段进行操作的连续碰撞检测(CCD)。我的问题是:我不知道怎么做。我知道如何在两个移动点(一个移动点和一个静态段)之间进行连续碰撞,但不知道如何

我正在研究一个2D碰撞器系统,该系统将形状分解为一个可能的基本体:由两点定义的不可穿透段。为了为该系统提供碰撞检测,我使用静态碰撞检测方法,每帧计算一个线段的边缘与当前处理的线段之间的距离(点/线距离)。如果距离太小,则会在该帧期间触发碰撞。这工作正常,但如果一个或多个物体表现出高速,则存在已知的隧道问题。因此,我正在修补替代品

现在我想介绍对动态点/动态段进行操作的连续碰撞检测(CCD)。我的问题是:我不知道怎么做。我知道如何在两个移动点(一个移动点和一个静态段)之间进行连续碰撞,但不知道如何在一个移动点(由点P定义)和一个移动段(由点U和V定义,两者都可以完全自由移动)之间进行CCD

我曾在SO和其他平台上看到过类似的问题,但并不是针对这些确切的要求:

  • 点和段都在移动
  • 段可以旋转和拉伸(因为U和V可以自由移动)
  • 两帧之间需要准确找到碰撞时间和碰撞点(CCD,无静态碰撞测试)
  • 如果可能的话,我更喜欢数学上完美的解决方案(无迭代近似算法,扫描体积)
  • 注意:由于U、V点的自由度()
  • 注意:使用扫描体积测试进行碰撞测试是不准确的,因为与多边形的碰撞点并不意味着实际移动中的碰撞点(,一旦实际线段穿过该点的轨迹,该点将离开多边形)
到目前为止,我提出了以下方法,given

  • sP(帧开始时的P)
  • eP(框架末端的P)
  • sU(帧开始处的U)
  • eU(框架末端的U)
  • sV(帧开始时的V)
  • 电动汽车(车架末端的电动汽车)
问题:它们会碰撞吗?如果是,何时何地

为了回答“如果”的问题,我发现这篇论文很有用:(第3.1节),但我无法得出“何时”和“何地”的答案。我在这里也找到了问题的另一种解释:(第三个问题)

解决方案

将帧期间每个点的时间轨迹建模为线性运动(0 TLDR的线轨迹 我确实读过“…大约5分钟来评估…”

没有太长的路,这是一个实时解决方案,为许多线和点

很抱歉,这不是一个完整的答案(我没有合理化和简化方程),它将找到截距点,我留给你们

此外,我可以看到解决方案的几种方法,因为它围绕一个三角形旋转(见图),当平面是解决方案时。下面的方法找到三角形的长边等于短边和的时间点

求解u(时间) 这可以做为一个简单的二次型,系数从3个起始点导出,每个点的单位时间内的向量

下图给出了更多细节

  • P是点的起始位置
  • L1L2是线端点的起点
  • 向量V1表示单位时间内的点(沿绿线)
  • 向量V2V3用于单位时间内的线端
  • u是单位时间
  • A是点(蓝色),而BC是线端点(红色)
有(可能)一个时间点u,其中aB线上,C。此时AB(asa)和AC(asC)的长度总和等于BC(asB)(橙色线)

这意味着当b-(a+c)==0时,点在直线上。在图像中,点被平方,因为这稍微简化了它。b2-(a2+c2)==0

在图像的底部是方程(二次型),表示u、p、L1、L2、V1、V2、V3

该方程需要重新排列,以便得到(?)u2+(?)u+(?)=0

很抱歉,手动执行此操作非常繁琐,而且很容易出错。我手头没有执行此操作的工具,也没有使用python,因此我不知道您使用的数学库。但是,它应该能够帮助您找到如何计算(?)u2+(?)u+(?)=0的系数

更新 忽略上面的大部分内容,因为我犯了一个错误。b-(a+c)==0b2-(a2+c2)==0不同。第一个是需要的,这是处理部首时的一个问题(请注意,仍然可以使用
a+bi==sqrt(a^2+b^2)来解决问题)
其中
i
是虚数)

另一个解决方案 所以我探索了其他的选择

最简单的方法有一个轻微的缺陷。它将返回截取时间。但是,必须验证这一点,因为它在截取线路时也将返回截取时间,而不是线段BC

因此,当找到一个结果时,您可以通过将找到的点和线段的点积除以线段长度的平方来测试它。请参见函数
isPointO