Вы можете моделировать пружины, применяя силы.На каждом временном шаге обновляйте силы на соединенных телах (будьте телами, если необходимо, тоже).Если одно из тел является землей (или статическим телом), вам не нужно прилагать к земле какую-либо силу, а только динамическое тело.
Обычная пружина будет прикладывать как силы натяжения, так и силы сжатия (тягаи толкать) в зависимости от прогиба.В вашем случае у вас есть банджи, поэтому не будет силы сжатия, только натяжение (тянуть).
Это формула, которая вам нужна:
F = K * x
Где F - сила, K - жесткость пружины (сила / прогиб), а x - прогиб.Прогиб рассчитывается как разница между начальной длиной и текущей длиной (расстоянием между точками соединения).Знак F определяет, тянет ли он или толкает.Как только вы вычислите F, вам нужно применить его вдоль линии, соединяющей две точки пружинного соединения.Для достижения баланса сил вам необходимо применить эту силу в противоположных направлениях (одно из тел становится положительным, а другое - отрицательной).Это потому, что сэр Ньютон так говорит.
Вот пример (работает с pyBox2D, но вы можете легко преобразовать это в C ++)
Вам нужны объекты Spring с некоторыми свойствами.Ваши пружинные объекты должны знать их начальную длину, жесткость, body1, body2, координаты соединения (b1x, b1y, b2x, b2y (в локальных координатах))
В вашем случае вам нужно проверить, если длина
body1 = spr.box2DBody1
body2 = spr.box2DBody2
pA = body1.GetWorldPoint(b2Vec2(spr.box2Db1x, spr.box2Db1y))
pB = body2.GetWorldPoint(b2Vec2(spr.box2Db2x, spr.box2Db2y))
lenVector = pB - pA
length = lenVector.Length()
deltaL = length - spr.initialLength
force = spr.K * deltaL
#normalize the lenVector
if length == 0:
lenVector = b2Vec2(0.70710678118654757, 0.70710678118654757)
else:
lenVector = b2Vec2(lenVector.x / length, lenVector.y / length)
sprForce = b2Vec2(lenVector.x * force, lenVector.y * force)
body1.ApplyForce(sprForce, pA)
body2.ApplyForce(-sprForce, pB)