当前位置:  开发笔记 > 编程语言 > 正文

基于速度的动力学滚动持续时间(动量)?

如何解决《基于速度的动力学滚动持续时间(动量)?》经验,为你挑选了1个好方法。

我正在尝试实现列表对象的动态滚动,但我在确定基于速度应用的摩擦量(持续时间)时遇到问题.

我的applyFriction()方法根据duration属性均匀地降低滚动对象的速度.但是,对于每个动作使用相同的持续时间(IE:1秒)似乎并不自然.

对于具有少量速度的运动(IE:5-10像素),1秒的持续时间看起来很好,但是对于具有大量速度(IE:100+像素)的运动,在1秒的持续时间内施加摩擦,滚动对象将显示为慢和停止更快.

基本上,我试图确定每个运动的适当持续时间,以便小的和大的速度将共享匹配的摩擦力,因此运动物体看起来总是具有恒定的"重量".

是否存在基于不同速度确定动能运动持续时间的通用算法?


注意:我正在使用ActionScript 3.0进行编程,并使用Tween类在一段时间内降低移动对象的速度.



1> kwantam..:

更好的摩擦模型是摩擦力与速度成正比.你需要一个常数来确定力和加速度之间的关系(质量,或多或少).将关系写成差分方程,

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).)

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有