我試圖在代碼中模擬動畫效果(幾乎任何語言都會這樣做,因爲它看起來像是數學而不是語言)。本質上,它是對質量彈簧系統的仿真。我一直在尋找WPF/Silverlight的ElasticEase
,這看起來和我正在尋找的東西非常接近,但並不完全。彈簧質量系統的阻尼效果(或者這是ElasticEase?)
首先,這裏是我正在尋找的東西 - 一個物體,行進一定的秒數,擊中一個位置,然後立即放慢並振盪一段時間,以便在阻尼是在同一點休息一段時間應用。所以想象這個,假設我有一個600瓦/ 900小時的畫布,並且我有一個正方形,開始在一個TranslateTransform.Y
中從900px到150px進行動畫處理。需要4秒才能達到150像素高度(每秒187.5像素),在此階段它會被阻擋,並且在0.4秒(每秒87.5像素)到115像素高度之間只會傳輸約35像素,然後反彈1秒到163像素高度(每秒48像素和48像素),然後反彈回146像素(每秒17像素和17像素),依此類推,直到眩暈減慢到最終的150像素。熬夜時間是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);
}
我已經包括2個視頻,以及一個Excel壓縮文件夾中的文件DropBox。我想這個問題將更多的是一個工作正在進行中,人們會問更多的澄清問題。
(免責聲明:我不知道我說的是當它涉及到很多這方面的東西)
你的問題是(如你所懷疑的)數學/物理學。這是一個標準的第一次物理過程阻尼振盪問題,但它需要幾百個單詞(以及一些數學公式,這在SO中非常糟糕)才能完全解釋。基本問題是阻尼是指數的,所以當你離散時,尾部振盪就會丟失。你確定你想要一個完整的解釋,而不僅僅是http://en.wikipedia.org/wiki/Damping? :) –
謝謝@belisarius。這個數學/物理學真的超越了我,特別是考慮到上面的例子似乎沒有考慮到質量。您可以提供的任何解釋和/或代碼示例可能會幫助我開始使用已知的變量,這些已知變量對我來說是最有幫助的。 –
我會嘗試,但是正如我預見的那樣,需要我花很多時間才能做得更好,也許一些物理學家/學生追逐賞金可能會讓我期待:)。順便說一下,質量是在那裏,但問題的所有其他常數(彈性常數和阻尼係數)除以質量得到質量獨立的問題(因爲Fm * a == 0等於零,您可以分成所有的術語,無論你想要什麼常數)。 F是兩個力的組合,彈性力與彈性常數k和位置成比例,阻尼力與速度和阻尼常數成比例。 –