Лучшей моделью для трения является то, что сила трения пропорциональна скорости.Вам понадобится константа, чтобы определить соотношение между силой и ускорением (масса, больше или меньше).Записывая отношения как разностное уравнение,
F[n] = -gamma * v[n-1]
a[n] = F[n]/m
v[n] = v[n-1] + dt * a[n]
= v[n-1] + dt * F[n] / m
= v[n-1] - dt * gamma * v[n-1] / m
= v[n-1] * (1 - dt*gamma/m)
Итак, если вы хотите, чтобы ваше замедление выглядело гладким и естественным, вместо линейного уменьшения скорости вы хотите выбрать некоторую константу чуть меньше 1 и многократно умножитьскорость по этой постоянной.Конечно, это только асимптотически приближается к нулю, поэтому вы, вероятно, хотите иметь порог, ниже которого вы просто устанавливаете скорость на ноль.
Так, например:
v_epsilon = <some minimum velocity>;
k_frict = 0.9; // play around with this a bit
while (v > v_epsilon) {
v = v * k_frict;
usleep(1000);
}
v = 0;
Я думаю, что вы 'Вы найдете, что это выглядит намного более естественным.
Если вы хотите приблизить это с линейным уменьшением скорости, то вы захотите сделать количество времени, которое вы тратите на замедление, пропорциональным натуральному логарифму начальной скорости,Это будет выглядеть не совсем правильно, но это будет выглядеть несколько лучше, чем у вас сейчас.
(Почему натуральное бревно? Потому что сила трения, пропорциональная скорости, устанавливает дифференциальное уравнение первого порядка, котороедает отклик типа exp (-t / tau), где тау является характеристикой системы. Время затухания от произвольной скорости до заданного предела пропорционально ln (v_init) в такой системе.)