2013-07-26 6 views
0

Я вижу, что есть несколько человек, задающих такие вопросы. Но нет ясного ответа. Мне еще предстоит найти какие-либо решения, которые легко поддаются обработке, а может быть, потому что я задаю гораздо более сложный вопрос, чем я думаю.JQuery UI Bounce Easing функция делает отказов меньше и/или управляет числом отскоков

Я использую эффект ослабления отскока jQuery UI при анимации, чтобы объект (ы) выпал на экран, а затем я хотел бы, чтобы он отскакивал только дважды, как если бы он был тяжелым объектом и не был очень оживленным. Кто-нибудь знает как это сделать? Вот функция Bounce, поскольку она является изначально в пользовательском интерфейсе. Любые идеи о том, какие переменные меняются и координируются вместе? Я попытался разобраться в этом сам, но у меня не хватает абстракции в этом типе функций и математической логики.

Native функция отказов:

Bounce: function (p) { 
     var pow2, 
     bounce = 4; 

    while (p < ((pow2 = Math.pow(2, --bounce)) - 1)/11) {} 
    return 1/Math.pow(4, 3 - bounce) - 7.5625 * Math.pow((pow2 * 3 - 2)/22 - p, 2); 
}, 

Я нашел другие функции рикошетов как:

for(var a = 0, b = 1, result; 1; a += b, b /= 2) { 
    if (p >= (7 - 4 * a)/11) { 
     return (-Math.pow((11 - 6 * a - 11 * p)/4, 2) + Math.pow(b, 2)); 
    } 
} 

В обеих функциях я знаю, что «р» в его наиболее основной формой является процент, как вдали от вашей цели.

У кого-нибудь есть идеи?

Я также нашел это:

https://github.com/clark-pan/Bounce-Function

Который работает действительно здорово, если вы хотите добавить целую кучу дополнительного кода, и я даже придумал, как получить сильный удар я хочу но я предпочел бы сделать обычное облегчение, которое позволит мне выполнить мои цели. Затем перепишите функцию отскока выше со всей связью постороннего кода.

Спасибо всем, у кого есть решение.

ответ

4

Как вы можете видеть из исходного кода, который вы уже предоставили, функции облегчения отказов - это всего лишь группа из n прерывистых функций по домену от 0 до 1, где n - количество отказов, которые вы хотите. Все, что вам нужно сделать, это сконструировать эти функции так, чтобы их y = 1 перехватывали все касание друг друга и манипулировали их максимумами/вершинами, чтобы имитировать хорошо разлагающийся отскок.

Для этого вам необходимо знать, как сдвинуть функцию, как перевернуть функцию и как масштабировать/растягивать функцию. Прочтите эту веб-страницу: Manipulating Graphs.

Напомним, что мы можем записать полиномиальные функции в факторизованной форме, чтобы легко определить, какими будут их корни (у = 0 перехваты). Давайте работать с квадратикой, чтобы все было просто. Так, например, функция будет иметь вид: f(x) = scalar * (x-root1)(x-root2) + constant. Поскольку мы хотим, чтобы отскок происходил при y = 1, а не у = 0, мы добавляем постоянное значение 1 ко всем нашим функциям. Для того, чтобы наши функции отката имели свою линию перехвата y = 1, вы должны подавать самый правый y = 1 перехват одной функции в следующую. Предположим, нам нужны четыре отскока. Наши уравнения будут выглядеть

f1(x)=a1(x+r0)(x-r1)+1 // Note: make r0 = r1 to center function's maxima at x=0 
f2(x)=a2(x-r1)(x-r2)+1 
f3(x)=a3(x-r2)(x-r3)+1 
f4(x)=a4(x-r3)(x-1) +1 // r4 = 1 because bounce ends at x=1 

После того, как вы создали эту систему уравнений, это просто вопрос настройки местоположения ваших у = 1 перехватывает (r0 через r3), и ваши скаляры (a1 через а4), чтобы дать желаемый интервал и амплитуды ваших отскоков. Вот пример, который я сделал в утилите Apple Grapher. Я настоятельно рекомендую вам подключить эти уравнения к аналогичной графической программе или калькулятору и играть со значениями (хотя бы потому, что вы можете придумать более плавную систему отскоков. Вероятно, вы захотите воссоздать форму this).

Example bounce graph

Так что я бы себе представить, что ваш код может быть что-то вроде

bounce(x): 
    x = clamp(x,0,1) 
    if x >= 0 and x < r1 then 
     return f1(x) 
    elseif x >= r2 and x < r3 then 
     return f2(x) 
    ... 
    else 
     return fn(x) 
    end 

Где f1, f2, ..., п ваши функции (но умножать вещи как можно больше, консолидировать константы и т. д.), а r1, r2, ..., rn - y = 1 перехваты ваших функций.

ПРИМЕЧАНИЕ. Это упрощенное решение, поскольку мы предполагаем, что мы хотим только квадратично гладкого ослабления. Вы можете использовать функции более высокого порядка, например. квартирой, но на данный момент я думаю, что это легче, если вам нужно только беспокоиться о двух корнях для каждой функции.