Wykrywanie kolizji lin 2D

13

Chcę stworzyć linę, która może kolidować z obiektami, jak na poniższym filmie na youtube:

Lina fizyki gry 2D

Myślę, że implementujesz integrację Verlet, która wykorzystuje punkty i łączy te punkty z liniami. Próbuję dowiedzieć się, jaki rodzaj wykrywania kolizji zastosowałbyś do liny, aby uzyskać efekt na filmie.

Myślę, że będziesz musiał zrobić trochę płyt CD do każdego punktu. Chciałbym użyć box2D, więc zastanawiam się, czy uczynienie z każdego punktu sztywnego ciała działałoby? Wszelkie porady będą mile widziane.

Joey Green
źródło
1
Jeśli dokładnie obejrzysz wideo w swoim łączu, jasne jest, że symulowana „lina” jest w rzeczywistości łańcuchem, tj. Dużą liczbą nieelastycznych segmentów połączonych w linii, a nie ciągłą elastyczną prymitywem. Jest to najbardziej oczywiste, gdy lina owija się wokół małej okrągłej przeszkody; widać rogi wokół niego. Łańcuch jest znacznie łatwiejszy do symulacji niż lina ciągła; każde łącze jest tylko prymitywem kolizji i jest trwale ze sobą połączone. Aby uzyskać bardziej przekonujące zachowanie, uczyń każde ogniwo bardzo sztywną sprężyną, a nie całkowicie nieelastyczną.
Paul Z

Odpowiedzi:

6

Ponieważ używasz Box2D, możesz utworzyć serię prostokątów i użyć połączeń Box2D, aby je połączyć. Tam masz swoją linę.

Aby uniknąć wysuwania się zakrętów z wygiętej liny, mogę sobie wyobrazić dwie opcje:

  1. Daj swoim segmentom liny zaokrąglone końce (aby nie były już prostokątami)
  2. Spraw, aby ta lina była niewidoczna i używaj jej tylko do fizyki. Weź pozycje stawów w każdej ramce i używać, aby wyciągnąć linę w locie, że gracz będzie widział.

Ostrzeżenie: sam nigdy tego nie próbowałem, ale nie widzę, jak seria połączonych prostokątów może się nie powieść, gdy opublikowany film wyświetla praktycznie to samo w przebraniu.

Edycja: Właśnie widziałem PaulZ i zdałem sobie sprawę z tego samego. Przeczytaj także jego komentarz do pytania.

doppelgreener
źródło
2

Szybki Google rzucił to tutaj . Demo, opis i kod (we Flashu) wykorzystujący Box2D do wdrożenia prostej liny. Lina zderza się ze sobą i blokiem na szczycie sceny.

Roger Perkins
źródło
0

Oto, co bym zrobił: uczyń każdy punkt na linii okręgiem, zrób wystarczającą liczbę punktów, aby okręgi zachodziły na siebie. Tethering każdego punktu z sąsiadem, zamiast standardowego zderzenia, ten tether powinien sprawić, że punkty pozostaną w stałej odległości od siebie.

Nie znam Box2D, ale sądzę, że wymagana funkcjonalność jest dostępna.

aaaaaaaaaaaa
źródło
0

Pierwotnie Box2D miał demo mostu linowego wykonanego z cienkich pudeł połączonych ograniczeniami punkt-punkt; byłoby to dobre miejsce na rozpoczęcie (nie wiem, czy nadal jest dostarczane z tą wersją demonstracyjną, ale odtworzenie tego byłoby proste).

Łatwo jest wdrożyć linę jako cząstki z ograniczeniami odległości niezależnie od symulatora sztywnego ciała (jak wspominasz, używając schematu integracji i rozwiązywania więzów Verlet, takiego jak ten opisany w tym artykule: http://www.gamasutra.com/resource_guide/ 20030121 / jacobson_pfv.htm ), ale jeśli chcesz, aby sztywne ciała reagowały na twoją linę (jak na wideo, z wiszącą skrzynką), to staje się znacznie bardziej skomplikowane. Zaczynam od kompleksowego zestawu narzędzi, takich jak Box2D, i pracuję wstecz, a następnie próbuję gromadzić się na cząstkach.

łódź 365
źródło
0

Pamiętam tę grę Allegro: Amorek z SpeedHack 2002. Zawiera ona implementację lin zderzających się z krajobrazem. Zobacz klasy PhysParticles i HeartTrails w pliku heart_tails.cpp w kodzie źródłowym .

dacap
źródło