Strona głównaArtykułyFizyka Ragdollów

Fizyka Ragdollów: Cząstki Verlet, Ograniczenia Odległości i Iteracyjne Rozwiązywanie

Jak szkielet postaci staje się siatką punktów i ograniczeń odległości rozwiązywaną przez tanie, niepodważalnie stabilne relaksacje.

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

Szkielet zbudowany z punktów i odległości, a nie kości i połączeń

Klasyczna mechanika ragdollowa opartej na sztywnych ciałach reprezentuje postać jako drzewo segmentów sztywnych połączonych z zawiasami kątowymi z ograniczeniami momentu obrotowego – dokładne, ale numerycznie sztywne i podatne na drgania pod wpływem złożonych ograniczeń. Ta symulacja zamiast tego wykorzystuje integrację Verlet z ograniczeniami odległości, tę samą metodę opartą na cząstkach, która zyskała popularność w przypadku tkanin i lin dzięki artykułowi Thomasa Jakobsena z 2001 roku "Advanced Character Physics" prezentowanemu na GDC. Ciało jest jedynie zbiorem mas punktowych (głowa, barki, łokcie, biodra, kolana, …) połączonych ograniczeniami odległości – sztywne lub półsztywne linki, które po prostu starają się utrzymać każdy parę połączonych punktów w stałej długości spoczynku.

demo na żywo · powiązana symulacja● LIVE

Integracja Verlet bez przechowywania prędkości

Każdy punkt porusza się pod wpływem integracji Störmera-Verleta: zamiast śledzić oddzielnie pozycję i prędkość, przechowuje się aktualną pozycję oraz poprzednią, a prędkość jest wyliczana pośrednio z ich różnicy.

// pozycja (Störmer) Verlet – nie potrzeba jawnej prędkości xNext = x + (x - xPrev) * tarcie + przyspieszenie * dt * dt xPrev = x x = xNext // prędkość jest wyliczana z (x - xPrev); ograniczenie po prostu przesuwa x bezpośrednio // a "prędkość" automatycznie aktualizuje się w kolejnym kroku. To właśnie dlatego integracja Verlet jest standardem dla systemów o dużym obciążeniu ograniczeniami, takich jak tkaniny, liny i ragdollsy, zamiast metod jawnie prędkości Euler'a lub Runge-Kutta używanych do symulacji orbit na innych stronach tego serwisu: solver ograniczeń, który musi spełnić warunek długości gałęzi lub kąta połączenia, może po prostu przesunąć punkt na właściwe położenie, a wyliczona pośrednio prędkość – różnica (x − xPrev) – automatycznie i konsekwentnie się aktualizuje, bez konieczności utrzymywania oddzielnej zmiennej prędkości.

// position (Störmer) Verlet — no explicit velocity needed
xNext = x + (x - xPrev) * damping + acceleration * dt * dt
xPrev = x
x = xNext
// velocity is implied by (x - xPrev); a constraint just moves x directly
// and the "velocity" automatically updates itself next step

Zadowalanie ograniczeń: relaksacja, a nie równania

Typowy ragdoll posiada kilkanaście lub więcej ograniczeń dystansowych (głębokoobramowa, przedramię, tułów, uda, łydki i tak dalej), wszystkie połączone z podzbiornymi stawami. Rozwiązywanie ich dokładnie i jednoczesnie stanowi kosztowny układ liniowy. Podejście Jakobsona zamiast tego wykorzystuje iteracyjną relaksację: przechodzi się przez każdą restrykcyjny, a następnie porusza się każdy parę połączonych punktów w kierunku zaspokajania własnej długości spoczynku, ignorując wszystkie inne ograniczenia w tym momencie, a następnie powtarza się cały proces kilka razy.

for (let iter = 0; iter < NUM_ITERATIONS; iter++) { for (const c of constraints) { const delta = c.p2.pos.sub(c.p1.pos); const dist = delta.length(); const diff = (dist - c.restLength) / dist; const correction = delta.scale(0.5 * diff); if (!c.p1.pinned) c.p1.pos.addInPlace(correction); if (!c.p2.pinned) c.p2.pos.subInPlace(correction); } } // każdy przebieg tylko przybliżają zaspokojenie każdej restrykcji; // wielokrotne powtórzenia zbliżają się do wzajemnie spójnej pozycji

for (let iter = 0; iter < NUM_ITERATIONS; iter++) {
  for (const c of constraints) {
    const delta = c.p2.pos.sub(c.p1.pos);
    const dist = delta.length();
    const diff = (dist - c.restLength) / dist;
    const correction = delta.scale(0.5 * diff);
    if (!c.p1.pinned) c.p1.pos.addInPlace(correction);
    if (!c.p2.pinned) c.p2.pos.subInPlace(correction);
  }
}
// each pass only approximately satisfies every constraint;
// repeated passes converge toward a mutually consistent pose

Od ograniczeń dystansowych do granic stawpień

Proste ograniczenie dystansu samo z siebie pozwoliłoby na wygięcie łokcia w przód o 360 stopni bez żadnego oporu, co wydaje się nieprawidłowe natychmiast po upadku ragdoll'a i nienaturalnych ustawień. Wiarygodne ragdoll'e dodają ograniczeń kątowych na szczycie ograniczeń dystansowych – dodatkowych połączeń lub sprawdzania kątów, które utrzymują, na przykład, kąt między ramieniem a przedramieniem w granicach anatomicznie możliwych, przy czym nadal polegają na tej samej iteracyjnej pętli relaksacji, aby je w przybliżeniu wymusić wraz z ograniczeniami dystansowymi, zamiast rozwiązywać dokładnie sztywną hierarchię stawpień.

Dlaczego ten podbój dominuje w grach

Systemy ograniczeń oparte na pozycji, zintegrowane z Verletem (ogólna rodzina obecnie często nazywana Dynamiczną Bazującą na Pozycjach, sformalizowana przez Müllera i in. w 2007 roku) są popularne w grach w czasie rzeczywistym i interaktywnych demonstracjach z trzech powodów: są bezwarunkowo stabilne niezależnie od tego, jak mocno przesunięto punkt, ponieważ bezpośrednio ustawiasz pozycje zamiast integrować siły, które mogłyby się wyewoluować; łatwo się składają z innych typów ograniczeń opartych na pozycji (tkanina, lina, ciała miękkie) w tym samym solverze; a ich koszt skaluje się liniowo i przewidywalnie wraz z liczbą ograniczeń i iteracji, co ułatwia budżetowanie wydajności w pętli gry w czasie rzeczywistym — co stanowi ostry kontrast z solverami ciał sztywnych, które mogą stać się numerycznie sztywne i niestabilne dokładnie wtedy, gdy scena staje się interesująca (góra lalek, stos pudeł).

Frequently asked questions

Dlaczego ta symulacja ragdoll nie śledzi bezpośrednio prędkości?

Wykorzystuje integrację Störmera-Verleta, która przechowuje aktualną i poprzednią pozycję zamiast jawnej prędkości. Prędkość jest implikowana przez różnicę między nimi, co oznacza, że solver ograniczeń może przesunąć punkt w nową pozycję, a właściwa prędkość na następnym kroku wyłania się automatycznie.

Dlaczego ciągnięcie ragdoll'a czasami sprawia, że jego kończyny wyglądają na rozciągnięte?

Solver ograniczeń wykorzystuje iteracyjne relaksacje zamiast dokładnego rozwiązania równoczesnego — każdy przebieg tylko częściowo zaspokaja każde ograniczenie odległości. Przy zbyt małej liczbie iteracji na klatkę, długie łańcuchy połączonych punktów (np. ramię) widocznie wykraczają poza ich położenie w spoczynku pod wpływem silnego ciągnięcia, zanim solver może to skorygować.

Czy jest to ta sama technika używana w komercyjnych silnikach gier?

Jest to ta sama rodzina, ogólnie nazywana Dynamiką Bazowaną na Pozycjach (PBD): cząstki z ograniczeniami odległości i kątów rozwiązywane iteracyjnymi relaksacjami pod integracją Verlet. Jest popularna szczególnie ze względu na jej warunkową stabilność i łatwość komponowania z tkaninami i linami w tym samym solverze, w przeciwieństwie do solverów połączeń sztywnych.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Ragdoll Physics 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ę Ragdoll Physics

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)