Autor Wątek: Ciała miękkie  (Przeczytany 2121 razy)

Offline taki_tam

  • Użytkownik

# Grudzień 06, 2007, 17:32:38
Siema! ;)

Od jakiegoś czasu pisze sobie silniczek 2D graficzny i fizyczny (taki kombajn) i napotkałem pewien problem z ciałami miękkimi. Z początku myślałem, że sobie poradzę w parę chwil, ale pipram się z tym już 2 dni.

Moduł zajmujący się ciałem miękkim posiada:
+ punkt materialny
+ sprężynę
+ ciało miękkie (jego skład to: 2 punkty materialne i jedna sprężyna)

Chce sobie zrobić jakby line z paru ciał miękkich.
Jeśli sznurek składa się tylko z jednego ciała miękkiego to wszystko jest ok. Ale ja zadeklarowałem sobie tablicę takich ciał (np. 4) i chce by do każdego końca było przymocowane kolejne ciało(do 1-2, do 2-3, do 3-4).
Więc daje by punkt pierwszy ciała drugiego był punktem drugim ciała pierwszego, punkt pierwszy ciała trzeciego był drugim punktem ciała drugiego itd.
I wszystko fajnie się łączy, ale symulacja nie przebiega prawidłowo(realnie), gdyż na każdy drugi punkt kolejnego ciała powinny oddziaływać siły ciał przyczepionych niżej.(sry, wiem że strasznie zagmatwałem, ale najlepiej będzie to widać na demku) Wygląda to tak jakby wszytskie ciała przyczepione były uzależnione od ciała pierwszego tylko i wyłącznie.
Więc chodzi mi o to jak obliczyć siłę działającą na te drugie punkty?

Link: http://www.sendspace.pl/file/gXuRTqrt/

Pozdrawiam! ;) kompustelnik taki_tam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

yfan

  • Gość
# Grudzień 06, 2007, 18:21:39
Są tacy, co się piprają czymś takim całe życie ;). Sprawdź dema i artykuły na stronie http://www.matthiasmueller.info/ (główny mózg za algorytmami fizyki w Ageia PhysX). Podejście tam lansowane zupełnie abstrahuje od symulacji opartej na siłach, na rzecz "position based dynamics", czyli fizyce opartej na pozycjach partykli.

Podstawowa zasada jest taka, że dla każdej cząsteczki przechowujemy pozycję aktualną i pozycję w poprzedniej klatce symulacji (w formie wektora, w naszym przypadku dwuwymiarowego, czyli pary liczb (x, y)). Co klatkę dodajemy wektor grawitacji i już ładnie symulujemy przyśpieszenie ziemskie. Do tego dochodzą "constrainty", które fiksują pozycję określonych partykli względem siebie, według określonej formuły. Najprostszy "distance constraint" bierze dwie cząsteczki, liczy ich odległość względem siebie i przesuwa odpowiednio do siebie, lub od siebie (każdą o połowę potrzebnej odległości). Kiedy "costraintów" jest więcej zachodzi oczywisty problem, że zadowolenie ograniczenia narzuconego na jedną z par, zaburza odległość pomiędzy pozostałymi parami - to jest rozwiązywane mechanizmem relaksacji, czyli wykonujemy czynność przesuwania cząsteczek na żądane odległości kilka razy w ciągu klatki.

Teraz ciała miękkie z takich patyczków: w najprostszej postaci wystarczy pobawić się parametrami poszczegołnych "constraintów" (patyczków), czyli albo nie przesuwamy każdej o połowę potrzebnej odległości, a - powiedzmy - o 0.2 i już to tworzy pewną miękkość na każdym segmencie liny, albo zwyczajnie decydujemy się na mniejszą ilość relaksacji całego systemu (na przykład jedną tylko).

Powyższy mechanizm to streszczenie artykułu Thomasa Jakobsena "Advanced Character Physics" (dostępny o tu: http://www.teknikus.dk/tj/gdc2001.htm), czyli metody używanej w pierwszym "Hitmanie".

Rozwinięcie metody Jakobsena znajdziesz w artykule wspomnianego Muellera (i spółki od PhysXa) pt. "Position Based Dynamics" (o tu: http://www.matthiasmueller.info/publications/posBasedDyn.pdf), który stanowi generalizację metody Jakobsena, rozszerzając ją o matematyczną metodę wyliczania innych niż "distance" costraintów. M.in. podaje sposoby symulowania ciśnienia wewnątrz zamkniętego "balonu", a więc ciał miękkich par exellance. O ile jednak Jakobsena polecam każdemu i każdy może zrozumieć tą zgrabną metodę (zwłaszcza, że zawarte są w artykule gotowe fragmenty kodu w c++), to już Mueller wymaga całkowania i solidnych podstaw matematycznych (które ja właśnie próbuje nabyć).

Edit: Co może nie jest bezpośrednią odpowiedzią na Twoje pytania, ale patrząc na załączone demo z marszu mówię: jest prostsza i efektowniejsza metoda symulowania liny. Konkretnie co nie gra w demie ciężko mi powiedzieć. Prócz tego może, że działa diabelnie wolno, z czym algorytmy Jakobsena nie miały jakichkolwiek problemów.
« Ostatnia zmiana: Grudzień 06, 2007, 18:29:38 wysłana przez yfan »

Offline taki_tam

  • Użytkownik

# Grudzień 06, 2007, 18:42:31
Znam ten art ("Advanced Character Physics") i robiłem te ciała miękkie co tam są opisane ale mnie tamta metoda nie przypadła do gustu.... Wole trzymać się standardów tzn. siła sprężystości i tłumienia.

OT: Co do tego że działa "diabelnie wolno"... cóż, trudno mi powiedzieć czemu.... Już nie jedna osoba mi to mówi... Nie wiem czy GLUT tak spowalnia czy co bo kod jest w 100% okej.

Edit:
Poza tym, u mnie działa dobrze (szybko).
END OT

Pozdrawiam! ;) kompustelnik taki_tam
« Ostatnia zmiana: Grudzień 06, 2007, 18:46:56 wysłana przez taki_tam »

Offline KriS

  • Użytkownik
    • KriS

# Grudzień 06, 2007, 18:49:27
Rozwinięcie metody Jakobsena znajdziesz w artykule wspomnianego Muellera (i spółki od PhysXa) pt. "Position Based Dynamics" (o tu: http://www.matthiasmueller.info/publications/posBasedDyn.pdf), który stanowi generalizację metody Jakobsena, rozszerzając ją o matematyczną metodę wyliczania innych niż "distance" costraintów. M.in. podaje sposoby symulowania ciśnienia wewnątrz zamkniętego "balonu", a więc ciał miękkich par exellance. O ile jednak Jakobsena polecam każdemu i każdy może zrozumieć tą zgrabną metodę (zwłaszcza, że zawarte są w artykule gotowe fragmenty kodu w c++), to już Mueller wymaga całkowania i solidnych podstaw matematycznych (które ja właśnie próbuje nabyć).

Hmm? Toz to jest ta sama metoda (zwroc uwage, ze na koncu artykulu Jacobsem napisal, ze mozna to tez opisac matematycznie). Swoja droga jakis czas temu Ageia opatentowala to position based dynamics :).

Co do samej metody, to nie jest tak pieknie. Zeby zasymulowac cos w miare sztywnego i skomplikowanego potrzebujemy duzej ilosci krokow relaksacji. Implementacja kolizji z dynamicznymi obiektami, jest dosc problematyczna. A najgorsze jest to, ze trudno jest ustalic parametry takiego modelu (bo to sie roznie zachowuje w zaleznosci od ilosci relaksacji, czestotliwosci symulacji i rozmiaru modelu). Bawilem sie tym i stwierdzilem, ze to jednak nie jest silver bullet :).

Offline taki_tam

  • Użytkownik

# Grudzień 06, 2007, 19:04:23
Cytuj
Zeby zasymulowac cos w miare sztywnego i skomplikowanego...

??
Ja tu mówię o ciałach miękkich. :) Line robie :)

Pozdrawiam! ;) kompustelnik taki_tam

yfan

  • Gość
# Grudzień 06, 2007, 19:39:16
Trudno je porównywać, bo są kierowane do całkiem innego odbiorcy - Jakobsen mówi, że można to zrobić matematycznie, Mueller pokazuje konkretnie jak liczyć. Słyszałem o patencie: może właśnie dlatego pokazana jest tutaj "podszewka" tych kalkulacji?

Czy pracując nad tą symulacją tkanin liczyłeś wzory dla innych constraintów niż "distance", albo bawiłeś się czymś jak zaprezentowane u Muellera balony pod ciśnieniem?

Offline KriS

  • Użytkownik
    • KriS

# Grudzień 06, 2007, 23:07:12
Ja tu mówię o ciałach miękkich. :) Line robie :)

Chodzi o to, zeby po zaczepieniu jednego z koncow lin, drugi nie opadl bezwladnie w dol rozciagajac line na kilka km :).

Mueller pokazuje konkretnie jak liczyć. Słyszałem o patencie: może właśnie dlatego pokazana jest tutaj "podszewka" tych kalkulacji?

To raczej glupie prawo patentowe rodem z USA :).

Czy pracując nad tą symulacją tkanin liczyłeś wzory dla innych constraintów niż "distance", albo bawiłeś się czymś jak zaprezentowane u Muellera balony pod ciśnieniem?

Zrobilem sobie ograniczenia do katow (swoja droga ten podany w pdf'ie jest niezupelnie poprawny) oraz do kolizji. Takimi trojwymiarowymi cialami miekkimi to sie nie bawilem, ale jakbym sie chcial bawic to raczej bym uzyl fastLSM.

Offline taki_tam

  • Użytkownik

# Grudzień 06, 2007, 23:22:10
Ale u mnie lina nie jest na bazie ciał sztywnych tylko miękkich. Punkty materialne łączy sprężyna, która w swoich właściwościach posiada stałą rozciągliwości, współczynnik tłumienia i długość nieodkształconej sprężyny. Punkt posiada oprócz wektorów, masę(no i odwrotność masy, wiadomo) ogółem to co potrzebne jest do symulacji punktu materialnego. Te kolejne kawałki liny nie opadają bezwładnie w dół tylko tylko działają na nie siły. Problem w tym że jeden kawałek nie oddziałuje na ten co jest wyżej. Np. jak koniec liny leci szybko to nie ma takiego szarpnięci odcinków z góry tylko te z góry działają na dolne.

Edit:
@KriS looknij sobie demko w załączniku to zobaczysz o co chodzi... lina nie zachowuje się naturalnie..

Pozdrawiam! ;) kompustelnik taki_tam

Offline counterClockWise

  • Użytkownik

# Grudzień 06, 2007, 23:43:48
Mógłbyś się do mnie odezwać na gg, bo ja się czymś takim właśnie zajmuję.

Ogólnie wiemy, że musimy zamodelować siły działające na każdy punkt tego łancucha (nie mylić z łańcuchem kinematycznym, bo to kojarzy się raczej z bryłami sztywnymi niż miękkimi - a mówisz, że potrzebujesz tych drugich.

Model sprężyny:

My realizujemy za pomocą jednowymiarowego liniowego modelu masy (można uogólnić na wielowymiarowy) - przyjmując, że układ jest tzw. układem skupionym - tj. zależność między działającą na masę siłą a przemieszczeniem jest liniowa.

Ruch masy zaczepionej w końcu sprężyny można opisać za pomocą równania różniczkowego II rzędu:

m*Xtt = F, gdzie

F = f + g + h

f = c*(w - X) - siła sprężystości, k - współczynniki sprężystości, w - funkcja wg której przemieszcza się położenie równowagi masy, x - położenie

g = - k *Xt  - siła tłumienia,  k - współczynnik lepkości ośrodka

h = siła pochodząca od zewnętrznego pola.

Jak lczyć h?
Dobrym modelem jest przyjęcie pewnych długości sprężyn połączeń i przyjęcie dodatkowej potencjalnej siły proporcjonalnej do rozciągnięcia lub ściśnięcia sprężyny. Jak liczyć rozciągnięcie - można przyjąć drugi wirtualny model połączeń, ale bez uwzględnienia sił potencjalnych sprężyń - i wtedy rozciągnięcie  jest różnicą położenia końców sprężyn z modelu wirtualnego i rzeczywistego. Takie rozciągnięcie jest wielkością wektorową, a siła w każdym punkcie jest wypadkową tych wektorów.

Żeby to policzyć można najłatwiej zmniejszyć rząd równania różniczkowego przez podstawienie V = X' i za pomocą różnic dzielonych albo można pokusić się o Rungego-Kuttę II rzędu.
Mam nadzieję, ze to okaże się trochę pomocne :)
« Ostatnia zmiana: Grudzień 06, 2007, 23:45:35 wysłana przez counterClockWise »

Offline cienio

  • Użytkownik

# Grudzień 07, 2007, 13:49:38
Dla ustalenia uwagi weźmy trzy ciała o jednakowej masie połączone sprężynami o jednakowym współczynniku sprężystości i jednakowej długości swobodnej:
Wektory  położenia ciał  to:
 [tex]\vec{r_{1}}, \vec{r_{2}},\vec{r_{3}}[/tex]
Liczymy siłę działającą na ciało 1:
Jest one połączone tylko z ciałem 2 więc siłą działająca na cialo 1 ze strony 2 będzie wynosić:
 [tex]\vec{F_{12}}=k(r_{12}-l)\frac{\vec{r_{12}}}{r_{12}}[/tex]
gdzie:
 [tex]\vec{r_{12}}=\vec{r_{1}}- \vec{r_{2}}[/tex],
 [tex]r_{12} [/tex]-długość wektora  [tex]\vec{r_{12}}[/tex]

Teraz ciało nr 2 połączone z 1 i 3:
Jedną siłę mamy od razu (policzona wyżej ze zmienionym znakiem ) i wynosi ona:
 [tex]\vec{F_{21}}=-\vec{F_{12}}[/tex]
Pozostaje policzyć siłę ze strony ciała nr 3:

 [tex]\vec{F_{23}}=k(r_{23}-l)\frac{\vec{r_{23}}}{r_{23}}[/tex]

Suma tych  siły i to siła działająca na ciało nr 2.

Na ciało nr 3  działa tylko  jedna siła :
 [tex]\vec{F_{32}}=-\vec{F_{23}}[/tex]


Widać więc jak należy liczyć dla układu n-ciał.

Dodajemy oczywiście grawitację dla każdego ciała i siłę oporu  proporcjonalną do prędkości.
Umieść to na liście jakiejś czy w tablicy i  jazda:)
pozdrawiam

« Ostatnia zmiana: Grudzień 07, 2007, 13:55:42 wysłana przez cienio »

Offline taki_tam

  • Użytkownik

# Grudzień 07, 2007, 14:44:49
@cienio: trafiłeś w samo sedno. Wielkie dzięki. :) ++

Pozdrawiam! ;) kompustelnik taki_tam