2

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

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

我想为对象规划一条路线,以在所需时间以所需矢量行驶到达所需点,并考虑到对象的起始矢量。

我对如何实现这一目标有点茫然。任何帮助表示赞赏。

4

1 回答 1

2

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

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

对于路径,三次贝塞尔曲线似乎非常适合该问题。三次贝塞尔曲线由 4 个控制点 P0、P1、P2 和 P3 定义。

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

这是一个交互式演示,可以了解控制点的位置如何影响曲线(三次贝塞尔曲线是右侧的蓝色曲线,有 4 个控制点)。

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

  • 将 P0 设置为飞行路径的起点
  • 将 P3 设置为终点
  • 将 P1 设置为从 P0 开始的速度矢量方向上的一个点
  • 将 P2 设置为与 P3 的结束速度矢量方向相反的点

在此处输入图像描述

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

如果您不想一直转动,您可以将路径分割成几条贝塞尔曲线,或者一条贝塞尔曲线然后一条直线然后一条贝塞尔曲线,并使切线在不同线段相交的地方匹配。例如,您可能希望在飞行路径的起点采用弯曲路径,然后在大部分路径中沿着直线行驶,在末端遵循弯曲路径以与所需的最终方向矢量对齐。这使您可以完全控制您的飞行路径。

该解决方案很容易推广到 3 个维度。

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

贝塞尔曲线的弧长

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

在此处输入图像描述

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

于 2015-05-14T11:49:25.897 回答