我正在尝试实现列表对象的动态滚动,但我在确定基于速度应用的摩擦量(持续时间)时遇到问题.
我的applyFriction()方法根据duration属性均匀地降低滚动对象的速度.但是,对于每个动作使用相同的持续时间(IE:1秒)似乎并不自然.
对于具有少量速度的运动(IE:5-10像素),1秒的持续时间看起来很好,但是对于具有大量速度(IE:100+像素)的运动,在1秒的持续时间内施加摩擦,滚动对象将显示为慢和停止更快.
基本上,我试图确定每个运动的适当持续时间,以便小的和大的速度将共享匹配的摩擦力,因此运动物体看起来总是具有恒定的"重量".
是否存在基于不同速度确定动能运动持续时间的通用算法?
注意:我正在使用ActionScript 3.0进行编程,并使用Tween类在一段时间内降低移动对象的速度.
更好的摩擦模型是摩擦力与速度成正比.你需要一个常数来确定力和加速度之间的关系(质量,或多或少).将关系写成差分方程,
F[n] = -gamma * v[n-1] a[n] = F[n]/m v[n] = v[n-1] + dt * a[n] = v[n-1] + dt * F[n] / m = v[n-1] - dt * gamma * v[n-1] / m = v[n-1] * (1 - dt*gamma/m)
因此,如果您希望减速看起来平滑自然,而不是线性降低速度,则需要选择一些略小于1的常数,并将速度反复乘以此常数.当然,这只是渐近逼近零,所以你可能想要一个阈值,低于该阈值你只需将速度设置为零.
所以,例如:
v_epsilon =; k_frict = 0.9; // play around with this a bit while (v > v_epsilon) { v = v * k_frict; usleep(1000); } v = 0;
我想你会发现这看起来更自然.
如果你想与线性速度降低到接近这一点,那么你会希望你的开支放缓成正比的自然对数的初始速度的时间量.这不会看起来很正确,但它会看起来比你现在的本事有所好转.
(为什么自然对数?因为与速度成比例的摩擦力设定一个第一阶微分方程,它给出了一个EXP(-t/TAU)类型的响应,其中,tau蛋白是该系统的一个特点.从任意衰减的时间速度给定的极限正比于在这样的系统LN(v_init).)