我正在尝试开发一款游戏。遵循具有一定惯性的路径的算法
我有一个起点与和起始载体(蓝色),下一个I画在其上欲遵循一定的惯性,或有限的角,并且步骤每一匝屏幕的路径(黑),其应该会产生红线。
你有关于如何编程这种算法的任何提示?
我正在尝试开发一款游戏。遵循具有一定惯性的路径的算法
我有一个起点与和起始载体(蓝色),下一个I画在其上欲遵循一定的惯性,或有限的角,并且步骤每一匝屏幕的路径(黑),其应该会产生红线。
你有关于如何编程这种算法的任何提示?
您可以创建一个差分格式,即离散时刻的源点的模型速度和坐标。假设你修正了一些dt = 0.1 sec
例如,起始速度由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)
是就近x0
点之间y[j]
指数,
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]))
...
你必须调整dt
和K
这里。 dt
应该足够小,以使轨迹平滑。更大的K
使轨迹更接近于精确定义,更小的K
使它更加放松。
编辑现在居然当我想到了一点,据我所知,力功能f
的选择并不好,因为引力使空间速度,即能为你的轨迹与期望的无限如果飞走初始速度太大。所以你应该构建另一个函数,可能只是沿着f(x) = K x
或f(x) = K x^alpha
的行,其中alpha > 0
。你看,这个方案是相当普遍的,所以你应该试验。
我认为[这篇文章](http://www.red3d.com/cwr/steer/gdc99/)解释了你的答案中描述的相同方法,但以更多的方式持有。我发现这是一个非常有趣和有益的阅读。 –
另一种选择是做这样的事情...
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!正如你提出你的问题,它太模糊,得不到一个特别好的答案。你在什么特定的限制下操作?我们可以假设世界的结构呢?您提供的细节越多,我们就可以提供更好的帮助。 – templatetypedef
黑色路径在第一步之前是否完全可用?或者,随着时间的推移,黑点是否逐渐可用?红线必须尽可能接近新显示的黑点?第一种选择是可取的。 – Dialecticus
@Dialecticus我认为在开始绘制红线之前,至少有一部分黑线是可用的,但是我应该能够在绘制黑线之前绘制红线。 @ templatetypedef我想不出任何约束,我试图模拟一个会遵循手绘路径的航班,但试图模拟惯性(物体可以转过的最小半径) – orko