顺利地使数字逼近零

时间:2010-03-03 10:51:55

标签: animation math

我有一个动画的浮点值X.在休息时它处于零,但有时外部源可能会将其更改为介于-1和1之间。

如果发生这种情况,我希望它顺利回到0.我目前做的事情就像

addToXspeed(-x * FACTOR);

// below is out of my control
function addToXspeed(bla) {
 xspeed += bla;
 x += xspeed;
}

动画中的每一步,但这只会导致X振荡。我希望它在0上休息。

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

5 个答案:

答案 0 :(得分:2)

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

|     x(t+1)| = | 1   dt | |     x(t)|  +  | 0 | u(t)
|xspeed(t+1)|   | 0    1 | |xspeed(t)|     | 1 | 

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

u(t) = [a  b] |     x(t)| = a*x(t) + b*xspeed(t)
              |xspeed(t)|

然后“闭环”系统变为

|     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

u(t) = a*x(t) + b*xspeed(t) = -(0.25/dt)*x(t) - xspeed(t)
addToXspeed(u(t))

这或多或少会出现在你自己的答案中

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

其中,如果要求我们将特征值设置为0.5,我们应该设置FACTOR = (0.25/dt)

答案 1 :(得分:1)

x = x * FACTOR

当因子介于0和1之间时,这应该可以解决问题。

因素越低,你就越快到0。

答案 2 :(得分:0)

为什么不定义从x递减的固定步骤?

你必须确保它足够小,以便所述人一次似乎不会以小爆发的方式旅行,但不足以让她不会以感知的速度移动。

答案 3 :(得分:0)

写下问题会导致实现答案。

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

// below is out of my control
function addToXspeed(bla) {
 xspeed += bla;
 x += xspeed;
}

这么简单

答案 4 :(得分:0)

如果你想缩放它但只能添加,那么你必须弄清楚要添加哪个值才能获得所需的缩放:

让我们说x = 0.543,我们想让它迅速走向0,即将其降低95%。

我们想做:

scaled_x = x * (1.0 - 0.95);

这会使x保持在0.543 * 0.05或0.02715。然后,您需要添加此值与原始值之间的差异才能获得此值:

delta = scaled_x - x;

这会使delta等于-0,51585,这是您需要添加以模拟缩放5%的内容。