Закон Гука при включении в Второй закон Ньютона - это дифференциальное уравнение второго порядка: m d^2 x/dt^2 = - k x
, где x - вектор. Как указывает Бета в комментариях, вы можете просто добавить трение. В отсутствие термина трения, такие орбиты, которые вы наблюдаете, являются обычными и будут продолжаться бесконечно. Обычный способ добавить трение состоит в том, чтобы добавить член, который пропорционален скорости, и, подобно члену Гука (-k*x
), он также отрицателен, то есть противодействует движению.
Если я правильно читаю ваш код, у вас уже есть что-то вроде этого термина в комментариях после настройки forceMag
. Но я не понимаю, как вы вычислили vrel
, похоже, что это скалярное произведение между относительной скоростью и вектором, соединяющим два тела. vdiff
уже правильная форма для этого. Также, в отличие от силы пружины, эта сила направлена вдоль относительной скорости (vdiff
). Таким образом, для его реализации я бы изменил строку, где вы вызываете ApplyForce
на bodyA
на
bodyA->ApplyForce(-1*diff - friction*vdiff,bodyB->GetPosition());