首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于速度的运动滚动(动量)持续时间?

基于速度的运动滚动(动量)持续时间?
EN

Stack Overflow用户
提问于 2010-11-23 23:47:54
回答 1查看 2.4K关注 0票数 2

我正在尝试实现列表对象的动态滚动,但我在根据速度确定要应用的摩擦力(持续时间)的数量时遇到了问题。

我的applyFriction()方法基于持续性属性均匀地降低滚动对象的速度。然而,对每个动作使用相同的持续时间(IE: 1秒)并不是很自然的。

对于速度较小的运动(IE: 5-10像素),1秒的持续时间看起来很好,但是对于速度很大的运动(IE: 100+像素),对1秒的持续时间施加摩擦会使滚动对象看起来变慢并停止得更快。

本质上,我试图为每个运动确定合适的持续时间,这样小的和大的速度都会有一个匹配的摩擦力,所以运动的物体看起来总是有一个恒定的“重量”。

是否有根据不同速度确定运动持续时间的通用算法?

注意:我正在用ActionScript 3.0编写程序,并使用Tween类来降低运动对象的持续时间速度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-24 00:08:17

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

代码语言:javascript
复制
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的常数,然后重复地把速度乘以这个常数。当然,这只是渐近接近于零,所以你可能想要有一个阈值,低于这个阈值,你就把速度设定为零。

因此,例如:

代码语言:javascript
复制
v_epsilon = <some minimum velocity>;
k_frict = 0.9; // play around with this a bit

while (v > v_epsilon) {
    v = v * k_frict;
    usleep(1000);
}

v = 0;

我想你会发现这看起来更自然。

如果你想用线性减速来近似这一点,那么你会想要使你所花的时间与初始速度的自然对数成正比。这看起来不太正确,但看起来会比你现在所得到的要好一些。

(为什么是天然原木?由于摩擦力与速度成正比,所以建立了一个一阶微分方程,它给出了一种exp(-t/τ)响应,其中τ是系统的一个特征。在这样的系统中,从任意速度衰减到给定极限的时间与ln(v_init)成正比。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4262221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档