wpf – d簧质量系统的阻尼效应(或这种d性优化?)

wpf – d簧质量系统的阻尼效应(或这种d性优化?),第1张

概述我试图在代码中模拟动画效果(几乎任何一种语言都会像数学而不是语言一样).基本上,这是一个质量d簧系统的仿真.我一直在看 WPF / Silverlight的ElasticEase,这似乎非常接近我正在寻找,但不完全相同. 首先,这里是我正在寻找的 – 一个物体,行驶一定秒钟,击中一个位置,并立即放缓到一定数量的秒钟,在同一个地方应用阻尼.所以为了可视化这一点,假设我有一个600w / 900h的画 我试图在代码中模拟动画效果(几乎任何一种语言都会像数学而不是语言一样).基本上,这是一个质量d簧系统的仿真.我一直在看 WPF / Silverlight的ElasticEase,这似乎非常接近我正在寻找,但不完全相同.

首先,这里是我正在寻找的 – 一个物体,行驶一定秒钟,击中一个位置,并立即放缓到一定数量的秒钟,在同一个地方应用阻尼.所以为了可视化这一点,假设我有一个600w / 900h的画布,我有一个正方形,在一个Translatetransform.Y中开始从900px到150px的动画.达到150px高度(187.5px每秒)需要4秒钟,在这个阶段,它立即被阻挡,只有0.4秒(87.5像素每秒),大约35像素,高达115像素,然后反d1秒至163像素高(每秒48像素和48像素),然后反d回146px(每秒17像素和17像素),等等,直到光线减慢到最终的150px的休息位置.停留时间为16秒.

上面我描述的例子是左上角的蓝色矩形:

这是我将提前知道的 – 从点A到点B所需的像素距离和秒数,用于点动的秒数.像群众一样似乎并不重要.

我已经尝试过ElasticEase,这个问题似乎是我不能让对象旅行,没有放松4秒,然后“反d”在接下来的16秒.即使我把它设置为一个非常高的数字,也就是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);        }@H_502_22@  

我已经在DropBox的压缩文件夹中添加了2个视频和一个Excel文件.我想这个问题将更多的是正在进行中的工作,因为人们问更多的澄清问题.

(免责声明:我不知道在谈论这些东西时我在说什么)

解决方法 跳过物理学,直接去等式.

参数:
“这是我将提前知道的 – 从A点到B点所需的像素距离[D]和秒数[T0],振荡的秒数[T1]”.另外,我将添加作为自由参数:振荡的最大大小,Amax,阻尼时间常数Tc和帧速率Rf,即什么时候想要一个新的位置值.我假设你不想计算这个永远,所以我只会做10秒,Ttotal,但有各种合理的停止条件…

码:
这是代码(在Python中).主要的是方程,在def Y(t)中找到:

from numpy import pi,arange,sin,expYstart,D = 900.,900.-150.  # all time units in seconds,distance in pixels,Rf in frames/secondT0,T1,Tc,Rf,Ttotal = 5.,2.,90.,30.,10. A0 = Amax*(D/T0)*(4./(900-150))  # basically a momentum... scales the size of the oscillation with the speed def Y(t):    if t<T0:  # linear part        y = Ystart-(D/T0)*t    else:  # decaying oscillations        y = Ystart-D-A0*sin((2*pi/T1)*(t-T0))*exp(-abs(T0-t)/Tc)    return yy_result = []for t in arange(0,1./Rf):  # or one Could do "for i in range(int(Ttotal*Rf))" to stick with ints        y = Y(t)    y_result.append(y)@H_502_22@  

这个想法是线性运动直到点,随后是衰减振荡.振荡由sin和衰减由乘以exp提供.当然,更改参数以获得所需的任何距离,振荡大小等.

笔记:

>评论中的大多数人都在建议物理方法.我没有使用这些,因为如果一个指定一个动作,它有点过分 – 从物理开始,去微分方程,然后计算运动,并调整参数以获得最后的事情.也可以直接到最后的事情.除非那就是他们想要从事的物理学的直觉.
通常在这样的问题上,想要保持连续的速度(一级派生),但你说“立即放慢”,所以我没有这样做.
>请注意,当应用阻尼时,振荡的周期和幅度将不会完全如同规定的那样,但这可能比您更关心的更详细.
>如果您需要将其表示为单一方程式,则可以使用“HeavisIDe函数”来打开和关闭贡献.

有可能造成这么长时间,我意识到我可以在GIMP中做一个gif,所以这就是它的样子:

如果有兴趣,我可以发布完整的代码来创建这些图,但是基本上我只是为每个时间步长调用具有不同D和T0值的Y.如果我再次这样做,我可以增加阻尼(即降低Tc),但这有点麻烦,所以我要离开它.

总结

以上是内存溢出为你收集整理的wpf – d簧质量系统的阻尼效应(或这种d性优化?)全部内容,希望文章能够帮你解决wpf – d簧质量系统的阻尼效应(或这种d性优化?)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1003531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存