ГоловнаСтаттіФізика обмежень

Різень та Ланцюг: Частинки, Обмеження, Без Пружин

Різень як ланцюг точок-частинок, пов’язаних за допомогою обмежень відстані, інтегрований з використанням Верле та розслаблений ітеративним розв’язником Якобсена – техніка, що використовується для тканини, ланцюгів та волосся в іграх.

mysimulator teamОновлено — червень 2026≈ 7 хв читання▶ Відкрити симуляцію

Забудьте про пружини – використовуйте обмеження

Зрозуміло, що можна змоделювати мотузку як ланцюг мас, з’єднаних жорсткими пружинами: сила пружини тягне сусідні точки до відстані спокою. На практиці це погана ідея. Пружина достатньо жорстка, щоб відчуватися як нерозтяжна мотузка, вимагає дуже малого кроку часу для забезпечення чисельної стабільності, а будь-який розумний бюджет кадрів робить мотузку помітно стрибаючою або просто вибухає. Альтернатива, яку використовують усі сучасні двигуни, полягає в тому, що ланцюги розглядаються як жорсткі геометричні обмеження – «ці дві точки повинні бути точно на відстані d один від одного», і вони безпосередньо застосовуються до положення, без будь-яких параметрів сили або жорсткості.

Верлет інтеграція: положення пам'ятає про швидкість безкоштовно

Кожен вузол мотузки зберігається лише як поточна позиція та попередня позиція, без окремої змінної швидкості. Положення Verlet обчислює рух точки, використовуючи лише ці дві позиції плюс прискорення, а швидкість випливає з різниці між ними, поділеної на крок часу. Ця властивість робить розв’язач обмежень простим: щоб задовольнити обмеження відстані, потрібно просто змістити поточну позицію - "швидкість" оновлюється автоматично на наступному кроці, без окремого обліку.

// per node, per frame
newPos = pos + (pos - oldPos) * damping + acceleration * dt * dt
oldPos = pos
pos    = newPos
жива демонстрація · пов'язана симуляція● LIVE

Розслаблення Якобсена: задовольняйте кожне з’єднання, знову і знову

Метод Томаса Якобсена 2001 року (використовувався в оригінальному двигуні Hitman) вирішує всю ланцюг обмежень із простотою грубої сили: переберіть кожне з’єднання та для кожного з них прямуєте або об’єднуєте дві пов’язані точки до їх остаточної відстані d, розподіляючи корекцію між ними пропорційно їхній інверсній масі. Робіть це для кожного з’єднання, потім повторіть весь прохід кілька разів на кадр. Кожен прохід лише частково розв’язує в’язкість перекриваючихся обмежень, але кілька ітерацій швидко достатньо, щоб здаватися повністю жорстким у реальному часі частот.

для ітерації з 1..N: // наприклад, N = 8-15 проходів на кадр для кожного з’єднання (a, b, restLen): delta = b.pos - a.pos dist = length(delta) diff = (dist - restLen) / dist a.pos += delta * 0.5 * diff * a.invMass / (a.invMass + b.invMass) b.pos -= delta * 0.5 * diff * b.invMass / (a.invMass + b.invMass) Фіксація кінця мотузки в цьому фреймворку є простим: дайте цьому вузлу нульову інверсність маси, і кожну корекцію, яка б перемістила його, повністю спрямують на свого сусіда. Той самий трюк фіксує мотузку до рухомої руки, обертає її навколо штиря, додаючи додаткові обмеження проти поверхні штиря, і перетворює той самий код у тканину, просто додавши 2D сітку з’єднань замість однієї ланцюга.

for iteration in 1..N:            // e.g. N = 8-15 passes per frame
  for each link (a, b, restLen):
    delta = b.pos - a.pos
    dist  = length(delta)
    diff  = (dist - restLen) / dist
    a.pos += delta * 0.5 * diff * a.invMass / (a.invMass + b.invMass)
    b.pos -= delta * 0.5 * diff * b.invMass / (a.invMass + b.invMass)

Катенарія: як виглядає мотузка в стані спокою

Підвішена під власною вагою між двома фіксованими точками, справжня мотузка або ланцюг приймає певну форму, яка називається катенар'ю (від латинського 'catena', що означає ланцюг): y = a·cosh(x/a), де 'a' визначається вагою мотузки на одиницю довжини та горизонтальним натягом. Це виглядає як парабола, але це не парабола - різниця в тому, що вага мотузки розподілена на одиницю її власної дуги, тоді як парабола є правильною лише за умови, коли навантаження розподілено на одиницю горизонтального прольоту, як у випадку з підлогою підвісних мостів, що висить від вертикальних кабелів. Добре налаштована симуляція мотузки природним чином відтворює форму катенарії, просто від гравітації, діючої на частинки, плюс обмеження відстаней - нікому не потрібно закодувати форму cosh.

Frequently asked questions

Чому змодельний трос розтягується замість того, щоб залишатися жорстким?

Це пов'язано з тим, що обмеження відстаней вирішуються за допомогою обмеженої кількості проходів релаксації, а не точно. Кожен прохід лише частково виправляє похибку між двома пов’язаними точками, тому якщо кількість ітерацій недостатня, трос поводиться як жорсткий пружинний механізм замість нерозтяжної мотузки. Збільшення кількості ітерацій (або застосування одного й того ж проходу більше ніж один раз на кадр) робить його ближчим до справжньої жорсткості, але це збільшує обчислювальні витрати.

Чи має ланцюг, що висить, ту саму форму, що й парабола?

Ні, хоча вони можуть виглядати схожими та їх легко сплутати. Ланцюг, що висить під власною вагою, опускається у форму катенари, y = a·cosh(x/a), оскільки напруга в кожній точці балансує навантаження, яке само по собі залежить від довжини дуги. Парабола є правильною формою для тросу підвісної мосту, оскільки навантаження (платформа) розподіляється рівномірно на одиницю горизонтальної відстані, а не на одиницю довжини мотузки.

Чому використовують інтегрування Верлея замість безпосереднього відстеження швидкості?

Зберігання лише поточної та попередньої позицій (з урахуванням, що швидкість визначається як їх різниця) робить забезпечення обмежень надзвичайно простим: достатньо перемістити точку, щоб задовольнити обмеження, і випливаюча швидкість автоматично оновлюється на наступному кроці. З змінною явного швидкості кожен крок корекції обмеження також повинен окремо виправляти швидкість, що є додатковою бухгалтерією, яку розроблені для уникнення розв’язувачі на основі Верлея.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Rope and Chain Physics і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Rope and Chain Physics

Що ви знайшли?

Додати кроки відтворення (опційно)