具有一定惯性的路径跟随算法

5
我试图开发一个游戏。
我有一个起点和起始向量(蓝色),之后我会在屏幕上绘制路径(黑色),我希望它能够以一定的惯性,或限制角度和步长的方式来跟随,并产生一条红线。
你有什么关于如何编写这种算法的建议吗?

1
欢迎来到 Stack Overflow!根据您提出的问题,它过于模糊,无法得到特别好的答案。您所面临的具体限制是什么?我们可以假设世界的结构是什么?您提供的细节越多,我们就能够提供更好的帮助。 - templatetypedef
在第一步之前,黑色路径是否完全可用?或者,随着时间的推移,黑点逐渐可用,红线必须尽可能紧密地跟随新揭示的黑点?第一个选项更可取。 - Dialecticus
@Dialecticus 我认为在我开始画红线之前,至少必须有黑线的一部分可用,但是在黑线绘制完成之前,我应该能够绘制红线。 @templatetypedef 我想不出任何限制,我正在尝试模拟沿着手绘路径飞行的飞行,但是尝试模拟惯性(物体可以绕过的最小半径)。 - orko
@Orko 黑线是导弹的移动目标还是赛车在赛道上的理想路径?如何定义绘制红线的成功和失败? - Dialecticus
@Dialecticus 我在想一架飞机,它不能在原地转弯,必须有一个最小的转弯半径才能跟随黑线。 - orko
导弹追逐飞机时不必跟随飞机的路径。 导弹的目标是最终击中飞机(以任何可能的角度)。 您的算法的目标也是这样吗? 无论路径如何,都要命中移动目标? - Dialecticus
2个回答

3
您可以创建一个差分方案,即在离散时间点上模拟源点的速度和坐标。例如,您可以固定一些dt = 0.1秒,起始速度由蓝色向量给出为v0。我们从x0开始。假设y[j]是黑色路径上的点。
x1 = x0 + v1 * dt,其中v1 = v0 + (y[k(x0)+1] - x0) * f(abs(y[k(x0)+1] - x_0))。其中
k(x0)y[j]中最靠近x0点的索引,
f(x)是一个函数,表征将你的轨迹拉到定义路径的力量。它仅针对非负的x进行定义。
这个模型将你的轨迹拉到定义路径中最接近当前模拟位置的下一个点。 f(x)的一个好例子可能是模拟重力作用的一个例子:f(x) = K/(x * x),其中K应该通过实验调整以给出自然的期望结果。
然后x2 = x1 + v2 * dt,其中v2 = v1 + (y[k(x1) + 1] - x1) * f(abs(y[k(x1) + 1] - x_1))等等: x[n+1] = x[n] + v[n+1] * dt,其中v[n+1] = v[n] + (y[k(x[n]) + 1] - x[n]) * f(abs(y[k(x[n])+1] - x[n]))...
您需要在这里调整dtKdt应该足够小,以使轨迹平滑。更大的K使轨迹更接近精确定义,更小的K使其更放松。 编辑现在我想了一下,我理解力函数f的选择不好,因为重力作用允许空间速度,即如果初始速度过大,则轨迹可以无限飞离所需的轨迹。因此,您应该构建另一个函数,可能只是沿着f(x) = K xf(x) = K x ^ alpha的线路,其中alpha > 0。您看,这个方案相当通用,所以您应该进行实验。

2
我认为 这篇文章 描述的是与您回答中相同的方法,但更为详细易懂。我读后觉得它很有趣且教育性强。 - Ricardo Sanchez-Saez

1

另一个选择是像这样做...

  1. Compute the average value of k points in the target path
     to get (<x>,<y>).
  2, Compte the angle between the most recent point in the path
     and (<x>,<y>) and turn that way; if the angle is too big,
     turn as hard as possible.
  3. Recompute (<x>,<y>) for the next set of k elements by sliding
     the window by 1; repeat step 2.

这可能会产生相当适当的行为。我可以举个例子,但这会相当乏味。请注意,这与unkulunkulu概述的方法类似,但在方法上有一些不同。


很好!这看起来比我的更容易控制。 - unkulunkulu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接