我正试图让一个物体位置到达另一个物体。而不是直接使用两者之间的矢量差异,而是根据归一化的差异向量来向前移动。但是我看到人们以一种奇怪的方式计算它。
这是一些伪代码。我们假设“A”想要转移到B.
// called every frame
function update()
{
Vec3 diff = B.position - A.position;
diff/=100;
A.position = A.position + diff;
}
当然,达到目标位置的方法涉及阻尼。确实, 它需要反复迭代。无论如何,它最终到达目标位置。那背后的数学是什么?我需要微积分来解决它吗?
答案 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 )
我使用粗体表示法,因为a
和b
可以是矢量。如果您按照上面的链接,您可以看到等式可以重写为
da / dt + p(t)* a = g(t)
p(t) = 1/100
和g(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)
,其中K
和C
取决于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: