解释逐步达到目标位置背后的数学

时间:2018-01-25 16:56:07

标签: algorithm math game-physics

我正试图让一个物体位置到达另一个物体。而不是直接使用两者之间的矢量差异,而是根据归一化的差异向量来向前移动。但是我看到人们以一种奇怪的方式计算它。

这是一些伪代码。我们假设“A”想要转移到B.

// called every frame
function update()
{
    Vec3 diff = B.position - A.position;
    diff/=100;   
    A.position = A.position + diff;
}

当然,达到目标位置的方法涉及阻尼。确实, 它需要反复迭代。无论如何,它最终到达目标位置。那背后的数学是什么?我需要微积分来解决它吗?

3 个答案:

答案 0 :(得分:3)

你还在使用它们之间的矢量差异,你只是在每一步向距离B移动1%的距离。当距离很远时,步骤越大,接近时步长越小。

此代码具有很酷的优势。希望它更快地接近:除以较小的数字。希望它接近慢:除以更大的数字。

此外,位置B可以是移动物体。向B移动,B移动。在下一步中,重新计算向量,使A移向新的B位置。

答案 1 :(得分:2)

Zeno's paradox的阴影。在每个步骤之后,两个位置之间的剩余距离是前一步骤中剩余距离的0.99倍,并且当(n)变为无穷大时,(0.99)^ n变为零。在无限远之前,距离将缩小到小于一个像素。数据类型和舍入错误给出了一个复杂的因素,因为可以想象diff可能在两个位置相同之前下溢到0(如果您使用浮点数来表示它们)。

答案 2 :(得分:1)

两个很好的答案,但他们没有进入算法背后的数学理论。该代码实际上描述了linear first-order ordinary differential equation

SO不支持Latex,所以我只是把它写成文本。 ODE描述如下:

  

d a / dt = 1/100 *( - a + b

我使用粗体表示法,因为ab可以是矢量。如果您按照上面的链接,您可以看到等式可以重写为

  

da / dt + p(t)* a = g(t)

p(t) = 1/100g(t) = 1/100 * b的位置。从此开始(再次链接)mu(t)= exp(1/100 * t)和目标:

  

K =积分(1/100 * b(t)* exp(-1/100 * t)dt)

这提供了一般解决方案:

  

a(t)= K + C * exp(-1/100 * t)

,其中KC取决于b的值,resp。 a的初始值。如果b(t)是常数,那么

  

a (t)= b +( a (0) - b )* exp( - 100分之1* T)

请记住exp(0)= 1和exp(-infinity)= 0

这一切意味着什么?

A遵循从起点到B的指数路径:最初它快速移动,但距离B越近越慢。

我提到的链接显示了这样一个指数曲线的例子,对于一些不同的起点,都是50:

exponential curve