Это идеальный кандидат для использования «пружины с критическим демпфированием».
Концептуально вы прикрепляете точку к целевой точке с помощью пружины или куска упругости.Пружина демпфируется, чтобы вы не подпрыгивали.Вы можете контролировать скорость реакции системы, изменяя константу, называемую SpringConstant.Это, по сути, то, насколько прочный кусок упругости.
В основном вы прикладываете две силы к позиции, а затем интегрируете это с течением времени.Первая сила, которая применяется пружиной, Fs = SpringConstant * DistanceToTarget.Второе - это демпфирующая сила, Fd = -CurrentVelocity * 2 * sqrt (SpringConstant).
CurrentVelocity является частью состояния системы и может быть инициализирована в ноль.
Inкаждый шаг, вы умножаете сумму этих двух сил на шаг по времени.Это дает вам изменение значения CurrentVelocity.Умножьте это на шаг по времени снова, и это даст вам смещение.
Мы добавим это к фактическому положению точки.
В коде C ++:
float CriticallyDampedSpring( float a_Target,
float a_Current,
float & a_Velocity,
float a_TimeStep )
{
float currentToTarget = a_Target - a_Current;
float springForce = currentToTarget * SPRING_CONSTANT;
float dampingForce = -a_Velocity * 2 * sqrt( SPRING_CONSTANT );
float force = springForce + dampingForce;
a_Velocity += force * a_TimeStep;
float displacement = a_Velocity * a_TimeStep;
return a_Current + displacement;
}
В системах, где я работал со значением около 5, было бы неплохо начать экспериментировать со значением постоянной пружины.Установка слишком высокого значения приведет к слишком быстрой реакции, а слишком низкая точка будет реагировать слишком медленно.
Обратите внимание, что лучше всего создать класс, который будет поддерживать состояние скорости, а не передавать его вфункция снова и снова.
Я надеюсь, что это полезно, удачи:)
РЕДАКТИРОВАТЬ: В случае, если это полезно для других, легко применить это к 2или 3 измерения.В этом случае вы можете просто применить CriticallyDampedSpring независимо один раз для каждого измерения.В зависимости от того, какое движение вы хотите, вам может быть лучше работать в полярных координатах (для 2D) или сферических координатах (для 3D).