寻找在2D空间中指向的时间限制路径

时间:2015-05-12 16:24:56

标签: math vector physics space pathing

我正在尝试在3D空间中进行飞行计划,但我实际上想要先弄清楚在2D空间中进行飞行计划。我有:

  • 具有已知当前位置和已知当前速度矢量的对象
  • 空间中的理想点
  • 期望的速度矢量
  • 期望的时间

我想计划一个路线,让物体在所需的时间在所需的矢量上到达所需的点,并考虑起始矢量的物体。

我对如何实现这一点感到有点失落。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

正如eigenchris在评论中指出的那样,这个问题有很多可能的解决方案,因此我将提出一种方法,该方法可以提供合理的结果,并允许灵活的自定义,具体取决于您所需的路径属性。

将问题分成两部分更容易,首先在2D中找到路径,然后沿着它计算距离,并解决将速度和加速度与距离匹配为1D(加时间)问题的问题。 p>

对于路径,Cubic Bézier curves似乎非常适合这个问题。 cubic Bézier curve由4个控制点P0,P1,P2和P3定义。

P0和P3是曲线的起点和终点。 P1和P2是控制点,用于指定起点和终点处的曲线的切线(分别由线P0-P1和P2-P3定义)。如果沿着曲线飞行,那些就是您在起点和终点处移动的方向。

这是一个interactive demo,可以了解控制点的位置如何影响曲线(立方Bézier是右边的蓝色曲线,有4个控制点)。

使用贝塞尔曲线定义飞行路径:

  • 将P0设置为航线的起点
  • 将P3设置为结束点
  • 将P1设置为从P0
  • 开始速度矢量方向的点
  • 将P2设置为与P3
  • 的结束速度矢量相反方向的点

enter image description here

请注意,从P0到P1以及从P2到P3的距离不代表起始速度和结束速度的大小。相反,它们指定曲线起点和终点处转弯的紧密度,以使曲线与起点和终点切线对齐。将控制点拉近并转动一圈,将它们向外推进一圈以获得更大的转弯。但是,如果你想要,你可以使转弯越大,所需的速度矢量越大,物理上就越逼真。

如果你不想一直转动,可以将路径分成几条Bézier曲线,或Bézier曲线然后是直线然后是Bézier曲线,并使切线与不同线段相交的位置匹配。例如,您可能希望在飞行路径的起点处采用弯曲路径,然后在大多数情况下沿直线行进,在末端跟随弯曲路径以与所需的最终方向向量对齐。这使您可以完全控制您的飞行路径。

该解决方案易于概括为三维。

现在你有了一条路径,你需要弄清楚如何沿着曲线加速和减速,以便在正确的时间和正确的速度到达目的地。首先,计算沿曲线的距离:

Arc Length of Bézier Curves

如果您知道开始时间,结束时间以及开始和结束速度(开始和结束速度矢量的大小),您可以计算出在开始和结束时间之间飞行的曲线的距离,假设你在旅途中从起始速度线性加速到结束速度(距离是线下面积):

enter image description here

由于此区域很可能与沿Bézier曲线计算的距离不同,因此您需要创建一个分段函数,该函数在开始和结束时间之间的线下具有所需的区域。该图像显示了两个这样的功能来处理行进距离大于期望的情况,并且通过减速然后以恒定速度行进然后加速来减小面积,反之亦然。这些例子显示了加速度的瞬时变化,但速度没有变化。您可以选择任何您喜欢的功能,只要开始和结束时间的开始和结束速度与所需的值匹配,并且功能下的区域等于沿路径的距离。