我想在代码中模拟动画效果(几乎任何语言都可以,因为它似乎是数学而不是语言)。
基本上,这是质点弹簧系统的仿真。我一直在看 WPF/Silverlight 的 ElasticEase
,这似乎非常接近我要找的东西,但还不够。
首先,这就是我要找的东西 - 一个对象在旅行了一定的时间后到达某个位置,并立即放慢速度,在一定的时间内振荡以停留在阻尼被应用的相同位置。
例如,假设我有一个 600w/900h 画布,我有一个正方形从 TranslateTransform.Y
的 900px 开始动画,一直到 150px。它需要 4 秒钟才能到达 150px 的高度(每秒 187.5px),此时它立即被阻尼并只移动约 35px(每秒 87.5px)到达 115px 的高度,然后向下反弹 1 秒钟到达 163px 的高度(48px 和每秒 48px),然后向上反弹到 146px(17px 和每秒 17px),依此类推,直到振荡使其缓慢到达最终停留位置为 150px。振荡周期为 16 秒。
上面描述的示例是此处左上角的蓝色矩形:
这里是我预先知道的内容 - 从点 A 到点 B 需要多少像素和时间,以及振荡所需的秒数。质量之类的东西似乎并不重要。
我尝试了 ElasticEase
,问题似乎是我无法让对象在没有缓动的情况下行驶 4 秒钟,然后在接下来的 16 秒钟内“弹跳”。即使我将 .Springiness
设置为非常高的数字,例如 20,它也总是太大。
ILSpy
显示其函数为:
protected override double EaseInCore(double normalizedTime)
{
double num = Math.Max(0.0, (double)this.Oscillations);
double num2 = Math.Max(0.0, this.Springiness);
double num3;
if (DoubleUtil.IsZero(num2))
{
num3 = normalizedTime;
}
else
{
num3 = (Math.Exp(num2 * normalizedTime) - 1.0) / (Math.Exp(num2) - 1.0);
}
return num3 * Math.Sin((6.2831853071795862 * num + 1.5707963267948966) * normalizedTime);
}
我在DropBox上打包了两个视频和一个Excel文件。我猜这个问题会随着人们提出更多的澄清问题而变得更加具体。
(免责声明:当涉及到这些事情时,我不知道我在说什么)