Strona głównaArtykułyŁańcuch i Linięta

Symulowanie Linii bez Rozpadu

Dynamika oparta na położeniu pomija całkowicie integrację sił, korygując bezpośrednio pozycje, dzięki czemu symulowany łańcuch ustala się w kształcie katenery i nigdy nie rozchodzi się.

mysimulator teamZaktualizowano — czerwiec 2026≈ 7 min czytania▶ Otwórz symulację

Dlaczego gry nie rozwiązują problemu z linami za pomocą sił

Lina lub łańcuch fizycznie jest bardzo długą serią sztywnych lub prawie sztywnych elementów połączonych w połączeniach, a symulowanie go poprzez obliczanie sił napięcia i integrację przyspieszeń (jak w przypadku ciała stałego) prowadzi do problemów numerycznych związanych z twardością: mocno nacięta sekcja opiera się na rozciąganiu tak silnie, że solver oparty na sile potrzebuje bardzo małego kroku czasowego, inaczej eksploduje. Dynamika bazująca na pozycji (PBD), wprowadzona przez Müllera i in. w 2007 roku, omija ten problem poprzez bezpośrednią pracę z pozycjami zamiast sił: każda ograniczenie (np. "te dwa punkty muszą być oddalone od siebie o stałą odległość") jest realizowana poprzez bezpośrednie przesuwanie pozycji, a następnie obliczane jest prędkość po tym, jak każdy punkt faktycznie się przesunął. Schemat ten jest bezwarunkowo stabilny w sensie, że nigdy nie ucieka do nieskończoności – lina symulowana w ten sposób rozciąga się przy zbyt małej liczbie iteracji, ale nigdy nie eksploduje.

demo na żywo · powiązana symulacja● LIVE

Rdzeń pętli

Każdy krok symulacji przebiega zgodnie z tym samym czterostopniowym wzorem, wykonywanym raz na klatkę:

1. przewidywanie: p* = p + v·h + a·h² (integracja jakby nie było ograniczeń) 2. rozwiązywanie: dla każdej zależności od odległości (i, j): Δp = korekta, która przyciąga |p*_i − p*_j| z powrotem do długości spoczynkowej L zastosuj Δp do p*_i i p*_j, ważoną przez odwrotne masy (powtórz dla wszystkich ograniczeń, kilka iteracji w stylu Gauss–Seidel) 3. aktualizacja v: v = (p* − p) / h 4. zatwierdzenie: p = p* Zależność od odległości między dwoma sąsiednimi punktami łańcucha i oraz j, z odwrotnymi masami w_i i w_j, jest korygowana proporcjonalnie do tego, jak bardzo każdy punkt może się swobodnie poruszać:

Δp_i = − w_i/(w_i+w_j) · (|p_i − p_j| − L) · (p_i − p_j)/|p_i − p_j| Δp_j = +w_j/(w_i+w_j) · (|p_i − p_j| − L) · (p_i − p_j)/|p_i − p_j| Wykonanie tej korekty raz na ograniczenie na klatkę na klatkę jest tanie, ale tylko przybliżone satysfakcjonuje każde ograniczenie jednocześnie, ponieważ niewielkie zaburzenie długości jednego z linków wpływa na sąsiednie; wykonywanie kilku iteracji Gauss–Seidel na klatkę (przechodzenie przez wszystkie ograniczenia wielokrotnie) pozwala korektom rozprzestrzeniać się wzdłuż łańcucha i zbliżać do globalnie spójnej, prawie nieciągnącej się liny. Więcej iteracji oznacza sztywniej wyglądającą linę za sprawą proporcjonalnie wyższego kosztu na klatkę.

1. predict:   p* = p + v·h + a·h²         (integrate as if unconstrained)
2. solve:     for each distance constraint (i, j):
                 Δp = correction that pulls |p*_i − p*_j| back to rest length L
                 apply Δp to p*_i and p*_j, weighted by inverse mass
              (repeat over all constraints, several iterations, Gauss–Seidel style)
3. update v:  v = (p* − p) / h
4. commit:    p = p*

Dlaczego pojawia się kształt łamania dla swobodnego obciążenia

Linia zawieszona pod wpływem grawitacji między dwoma nieruchomymi punktami przyjmuje kształt łamania – krzywą y = a * cosh(x/a), która minimalizuje energię potencjalną grawitacji, przy zachowaniu ustalonej całkowitej długości – a solver PBD naturalnie do niej dochodzi, bez potrzeby kodowania równania: grawitacja ciągnie każdy punkt progowy w dół, a ograniczenia odległości opierają się przedłużeniem, a równowaga tych dwóch przeciwnych efektów, iterowana do zbieżności, jest dokładnie tym kształtem, jaki przyjmuje rzeczywista zawieszona łańcuch. Podobnie jak linia główna mostu wiszącego jest bliska łamania (paraboliczna pod stałym obciążeniem poziomym, aby naśladować to, co się dzieje w rzeczywistości, ale są one prawie identyczne dla małego spadku), fizyka minimalizuje energię, a solver ograniczeń dokonuje tego numerycznie, krok po kroku.

Zasady fal i kolizji

Ponieważ każdy element łańcucha komunikuje się tylko z najbliższymi sąsiadami, ostre zakłócenie na końcu łańcucha (np. szybki ruch) rozprzestrzenia się wzdłuż liny jako prawdziwa fala przenosząca się poprzecznie, a zablokowanie obu końców przekształca linę w naturalny rezonator fal stojących, wykorzystując tę samą zasadę fizyki co struna poddawaną działaniu siły. Widoczne są podstawowe i wyższe harmoniczne, reprezentowane przez liczbę iteracji Gauss-Seidel i wzrost symulowanej naprężenia.

Kolizje między elementami łańcucha są dodawane w podobny sposób jak każda inna ograniczenie: gdy dwa segmenty liny, które nie są bezpośrednio połączone, zbliżają się do siebie zbyt mocno, nierówność (zamiast równości) popycha je od siebie tylko wtedy, kiedy ta nierówność jest naruszona. Pozwala to linie zwijać i nakładać się na siebie bez przenikania.

Frequently asked questions

Dlaczego symulacja liny PBD nigdy nie eksploduje, jak fizyka oparta na sile?

PBD działa bezpośrednio na pozycjach zamiast integrować siły i przyspieszenia dla sztywnych ograniczeń. Ponieważ każde ograniczenie jest zaspokajane poprzez bezpośrednie przesuwanie punktów o ograniczoną odległość, a nie przez aplikowanie potencjalnie ogromnej siły korygującej, nie występuje niestabilny pętla sprzężenia zwrotnego, która mogłaby wzrosnąć bez ograniczeń, tylko niedokończenie jeśli zbyt mało iteracji zostanie wykonanych.

Dlaczego lina wisząca tworzy łuk katenoidalny, nawet jeśli nikt nie programuje tej kształtu?

Katenoida jest po prostu kształtem, który minimalizuje potencjalną energię grawitacyjną dla ustalonej długości liny. Ponieważ krok grawitacyjny w PBD ciągnie punkty w dół, a ograniczenia odległości opierają się na rozciąganiu, iterowanie tych dwóch efektów do równowagi numerycznie daje ten sam kształt minimalizujący energię jak równanie katenoidalne analityczne.

Co się stanie, jeśli uruchomi się tylko jedną iterację ograniczenia na klatkę zamiast kilku?

Lina będzie widocznie się rozciągać poza jej długość spoczynkową, ponieważ pojedyncze przejście tylko częściowo rozwiązuje każdy łącze przed tym, gdy sąsiadujące również się przesuną. Zwiększenie liczby iteracji Gauss-Seidela na klatkę sprawi, że lina będzie wyglądała bardziej sztywno i bliżej nieciągliwej, kosztem proporcjonalnego wzrostu kosztów obliczeniowych.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Chain and Rope i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Chain and Rope

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)