Animation 平稳地使数字接近零

Animation 平稳地使数字接近零,animation,math,Animation,Math,我有一个浮点值X,它是动画的。当处于静止状态时,它为零,但有时外部源可能会将其更改为-1和1之间的某个位置 如果发生这种情况,我希望它平稳地回到0。我现在做的是 addToXspeed(-x * FACTOR); // below is out of my control function addToXspeed(bla) { xspeed += bla; x += xspeed; } 附加速度(-x*系数); //下面是我无法控制的 功能速度(bla){ xspeed+=bla; x+=

我有一个浮点值X,它是动画的。当处于静止状态时,它为零,但有时外部源可能会将其更改为-1和1之间的某个位置

如果发生这种情况,我希望它平稳地回到0。我现在做的是

addToXspeed(-x * FACTOR); // below is out of my control function addToXspeed(bla) { xspeed += bla; x += xspeed; } 附加速度(-x*系数); //下面是我无法控制的 功能速度(bla){ xspeed+=bla; x+=x速度; } 动画中的每一步,但这只会导致X振荡。但是,我希望它位于0上

(我已经在摘要中解释了这个问题。我试图做的具体事情是通过施加旋转力使跳跃游戏角色在空中保持直立平衡)

x=x*FACTOR

当因子在0和1之间时,这应该可以实现


系数越低,越快变为0。

为什么不定义一个从
x
递减的固定步长


你只需要确保它足够小,这样说的人似乎不会一次以小的爆发速度旅行,但也不会小到她不会以感知的速度移动。

写TENS问题会让你意识到答案

targetxspeed = -x * FACTOR; addToXspeed(targetxspeed - xspeed); // below is out of my control function addToXspeed(bla) { xspeed += bla; x += xspeed; } targetxspeed=-x*因子; addToXspeed(targetxspeed-xspeed); //下面是我无法控制的 功能速度(bla){ xspeed+=bla; x+=x速度; }
太简单了

如果您想缩放它,但只能添加,那么您必须确定要添加哪个值才能获得所需的缩放:

比如说,
x=0.543
,我们想让它迅速向0移动,也就是说,将它降低95%

我们希望做到:

scaled_x = x * (1.0 - 0.95);
这将使x保持在0.543*0.05,或
0.02715
。该值与原始值之间的差值就是获得该值所需添加的值:

delta = scaled_x - x;
这将使delta等于
-051585
,这是您需要添加的,以模拟5%的缩放比例。

有趣的问题。 您要求的是以下离散时间线性系统的稳定性:

|     x(t+1)| = | 1   dt | |     x(t)|  +  | 0 | u(t)
|xspeed(t+1)|   | 0    1 | |xspeed(t)|     | 1 | 
其中,
dt
是采样时间,
u(t)
是您添加的速度()。(此外,系统在第一个变量
x
上受到随机干扰,我在上面的等式中没有显示。)现在,如果您“将控制输入设置为等于状态的线性反馈”,即

然后“闭环”系统就变成了

|     x(t+1)| = | 1   dt  | |     x(t)|
|xspeed(t+1)|   | a   b+1 | |xspeed(t)|
现在,为了获得系统的“渐近稳定性”,我们规定闭环矩阵的特征值被放置在“复单位圆内”,我们通过调整
a
b
来实现这一点。我们把特征值放在0.5。 因此,闭环矩阵的特征多项式

(s - 1)(s - (b+1)) - a*dt = s^2 -(2+b)*s + (b+1-a*dt)
应该相等

(s - 0.5)^2 = s^2 - s + 0.25
如果我们愿意,这是很容易做到的

b = -1    a = -0.25/dt

这或多或少就是你自己的答案

targetxspeed = -x * FACTOR;
addToXspeed(targetxspeed - xspeed);

式中,如果要求我们将特征值设置为0.5,我们应设置
因子=(0.25/dt)

因子应介于0和1之间。什么类型的
x
?无论如何,浮点数可能不够精确。顺便说一下,您的代码是
x=x-x*f
,它与
x=(1-f)x
相同。这是对
因子
的一个稍微向后的定义。在上下文中,您可以编程吗?您是否有变量(如果有,可以告诉您值何时更改)?
0.5
达到零需要比
1
少一半的时间,甚至是时间吗?我是否正确理解您不能直接为Xspeed赋值?你能读懂Xspeed的值吗?@AB:没错,我能读懂它的值。这就是我如何得出下面的解决方案的。我认为这会起作用,但我有以下问题:我不能真正分配x,我只能调用函数addToX(bla)。正在转换声明…实际上我错误地记录了发生的事情。我编辑了我的问题。嗨,对不起,我忍不住。此外,我认为如果你选择的因子太大,你可能会破坏系统的稳定性,也就是说,粒子离零越来越远。我还认为,他以前政策的波动行为可以在这个框架内解释……哇……广泛。下一次当我有这样但更复杂的东西时,我会回去深入阅读这个答案:)
u(t) = a*x(t) + b*xspeed(t) = -(0.25/dt)*x(t) - xspeed(t)
addToXspeed(u(t))
targetxspeed = -x * FACTOR;
addToXspeed(targetxspeed - xspeed);