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.
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