Sto tentando di emulare un effetto di animazione nel codice (quasi qualsiasi linguaggio farebbe come sembra essere matematica piuttosto che linguaggio). Essenzialmente, è l'emulazione di un sistema di molle di massa. Ho guardato WPF/Silverlight ElasticEase
e questo sembra essere abbastanza vicino a quello che sto cercando, ma non del tutto.Effetto smorzamento del sistema Spring-Mass (o è questo ElasticEase?)
Prima di tutto, ecco quello che sto cercando - un oggetto, un viaggio di un certo numero di secondi, colpendo una posizione e subito rallentare per ocsillate per un certo numero di secondi a riposare nello stesso punto in cui lo smorzamento è stato applicato. Quindi, per visualizzarlo, diciamo che ho una tela da 600w/900h e ho un quadrato che inizia ad animare da 900px a 150px in un TranslateTransform.Y
. Occorrono 4 secondi per raggiungere un'altezza di 150px (187,5px al secondo), in quale fase viene immerso e si sposta solo di circa 35px in più per 0,4 secondi (87,5 px al secondo) a 115px in altezza, quindi rimbalza per 1 secondo a 163px di altezza (48px e 48px al secondo) e poi rimbalza fino a 146px (17px e 17px al secondo) e così via fino a quando le ocillazioni lo rallentano fino alla posizione finale di riposo di 150px. Il periodo di ocillazione è di 16 secondi.
L'esempio che ho descritto sopra è in alto a sinistra rettangolo blu qui:
Ecco ciò che io voglio sapere in anticipo - la distanza dei pixel e il numero di secondi necessari per andare dal punto A al punto B, il numero di secondi per l'ocillazione. Cose come la massa non sembrano avere importanza.
Ho provato ElasticEase
e il problema sembra essere che non riesco a far viaggiare l'oggetto senza attenuazione per 4 secondi e quindi "rimbalzare" per i successivi 16 secondi. Il .Springiness
è anche sempre un po 'troppo, anche se ho impostato per essere un numero molto alto come 20.
ILSpy dello show la sua funzione:
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);
}
Ho incluso 2 video e ed Excel file in una cartella zippata su DropBox. Credo che questa domanda sarà più di un work-in-progress come la gente fa più domande di chiarimento.
(NOTA BENE: Non so di cosa sto parlando quando si tratta di gran parte di questa roba)
Il tuo problema è (come sospetti) uno di matematica/fisica. Si tratta di un problema di oscillazione attenuato nel primo corso di fisica standard, ma ci vorrà qualche centinaio di parole (e alcune formule matematiche, che rendono piuttosto male in SO) da spiegare completamente. Il problema di base è che lo smorzamento è esponenziale, quindi quando lo discretizzi, le oscillazioni della coda sono perse. Sei sicuro di volere una spiegazione completa invece di http://en.wikipedia.org/wiki/Damping? :) –
Grazie a @belisarius. La matematica/fisica è davvero al di là di me con questo, soprattutto considerando che l'esempio sopra non sembra prendere in considerazione la massa. Qualsiasi esempio di spiegazione e/o codice che potresti fornire che potrebbe aiutarmi a iniziare con questo con le variabili conosciute che ho prima di me sarebbe molto utile. –
Ci proverò, ma come previsto, mi ci vorrà un sacco di tempo per farlo bene, forse un fisico/studente che insegue una taglia potrebbe anticiparmi :). A proposito, la massa è lì, ma tutte le altre costanti del problema (costante elastico e coeff di smorzamento) sono divise dalla massa per ottenere un problema indipendente dalla massa (dato che Fm * a == 0 è uguale a zero, puoi dividere tutti i termini in base alla costante che desideri). La F è la composizione di due forze, quella elastica, proporzionale alla costante elastica k e la posizione, e la forza di smorzamento, proporzionale alla velocità e una costante di smorzamento. –