我试图在代码中模拟动画效果(几乎任何语言都可以,因为它似乎是数学而不是语言).从本质上讲,它是质量弹簧系统的仿真.我一直在看WPF/Silverlight ElasticEase,这看起来非常接近我正在寻找的东西,但并不完全.
首先,这里就是我要找的-一个对象,旅游若干秒,创下了位置,并立即下降放缓至ocsillate一定的秒数在涂敷阻尼的相同点休息.所以为了想象这个,让我说我有一个600w/900h的画布,我有一个正方形,开始动画从900px到150px TranslateTransform.Y.它需要4秒内达到150像素高度(每秒187.5px),在该阶段它被immediated阻尼并且仅行进大约35px更0.4秒(每秒87.5px)至115px高度,然后向下篮板1秒至163px高度(48px和48px每秒),然后回升到146px(17px和17px每秒),依此类推,直到ocillations减慢到最后150px的休息位置.ocirlation时间是16秒.
我上面描述的例子是左上角的蓝色矩形:

这是我事先知道的 - 像素距离和从A点到B点所需的秒数,即ocirlation的秒数.像质量这样的东西似乎并不重要.
我已经尝试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);
}
Run Code Online (Sandbox Code Playgroud)
我在DropBox的压缩文件夹中包含了2个视频和一个Excel文件.我想这个问题将更多的是正在进行的工作,因为人们会提出更多澄清问题.
(免责声明:当涉及到大部分内容时,我不知道我在谈论什么)