Я пытаюсь подражать эффекту анимации в коде (почти любой язык будет делать, как представляется, математика, а не язык). По сути, это эмуляция системы массой spring. Я смотрел на WPF/Silverlight ElasticEase
, и это похоже на то, что я ищу, но не совсем.
Прежде всего, вот что я ищу - объект, путешествующий определенное количество секунд, попав в место и немедленно замедляясь, чтобы оциллировать в течение определенного количества секунд, чтобы отдохнуть в той же точке, где было применено демпфирование, Чтобы визуализировать это, скажем, у меня есть холст 600 Вт /900 ч, и у меня есть квадрат, который начинает анимироваться от 900 пикселей до 150 пикселей в TranslateTransform.Y
. Требуется 4 секунды, чтобы достичь высоты 150 пикселей (187,5 пикселей в секунду), на какой стадии он сразу же затухает и только перемещается на 35 пикселей больше на 0,4 секунды (87,5 пикселей в секунду) до высоты 115 пикселей, а затем отскакивает на 1 секунду до высоты 163 пикселей (48px и 48px в секунду), а затем восстанавливается до 146px (17px и 17px в секунду) и так далее до тех пор, пока ocillations не замедлят его до конечного места отдыха 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);
}
Я включил 2 видео и файл Excel в папку с zipped на DropBox. Думаю, этот вопрос будет скорее продолжением работы, так как люди задают более разъясняющие вопросы.
(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не знаю, о чем говорю, когда дело доходит до многих вещей)