Jak obchodzić się z małymi przedmiotami w silniku fizyki?

13

Tworzę silnik fizyki 3D do rzucania kostkami. Do tej pory kostka miała 1x1x1m, a grawitacja 9,82 m / s ^ 2. To oczywiście nie wygląda realistycznie, ponieważ kości zareagują na wszystko w sposób, który wygląda trochę powolnie.

Aby to naprawić, próbowałem po prostu zmienić wszystkie rozmiary, aby kostka miała około 0,02 m wzdłuż boku. To z kolei sprawiło, że moje odwrotne masy i odwrotne macierze bezwładności otrzymały bardzo duże wartości, co prowadzi do niestabilności numerycznej.

Jaka jest najlepsza droga, aby sobie z tym poradzić? Czy mogę utrzymać skalę tak, aby kostka miała wymiary 1x1x1 i po prostu zmienić masę lub rozmiar działających sił? Czy powinienem ulepszyć coś jeszcze?

Myślę, że ten sam problem może się pojawić, jeśli stworzysz grę z bardzo dużymi ciałami fizycznymi, takimi jak statki kosmiczne lub coś takiego, więc mam nadzieję, że ktoś wcześniej wpadł na coś podobnego.

Mikael Högström
źródło
Nie jestem tutaj ekspertem, ale bez kodu skąd możemy wiedzieć, na czym polega problem? Prawdopodobnie się mylę, ponieważ Box2D ma te same problemy.
jcora,
1
(Widząc wszystkie opinie, musi istnieć konwencjonalny sposób kodowania tych rzeczy, a ludzie wydają się wiedzieć, z czym masz problem. Wydaje mi się, że się myliłem.)
jcora
1
Tak, myślałem, że może być konwencjonalny sposób na poradzenie sobie z tym. Moim zdaniem nie jest to problem z kodem, ale raczej problem z dokładnością liczbową. To, czego szukam, to nie fragment kodu do rozwiązania mojego problemu, ale raczej wyjaśnienie podejścia do problemu.
Mikael Högström,
Masz na myśli precyzję zmiennoprzecinkową?
jcora,
W pewnym sensie tak. Odwrotność macierzy bezwładności, której używam w obsłudze kolizji, otrzymuje bardzo duże wartości. W rzeczywistości nie jest to źle uwarunkowane, ponieważ elementy przestawne otrzymują duże wartości i nie dzieje się zbyt wiele, ale jakoś musi być problem z precyzją liczbową, ponieważ symulacja szybko wymyka się spod kontroli.
Mikael Högström,

Odpowiedzi:

1

Mógłbyś

  • zwiększyć stałą grawitacji? Gry często używają 2 * 9,81 m / s ^ 2. Nie pamiętam, gdzie to czytam, ale gry zwykle używają nie sensownych jednostek. Niezależnie od stałych, które wydają się właściwe (spraw, aby gra była przyjemna). Użycie realistycznej stałej sprawia, że ​​fizyka wydaje się powolna i płynna.
  • uruchomić symulację szybciej. Jeśli używasz określonego czasu, zwiększy to tempo animacji.
  • używać pływaków o wyższej precyzji?
torbjoernwh
źródło
Drugi punkt nie zrobi nic, ale sprawi, że symulacja będzie płynniejsza, a może nawet ją przerwie, jeśli symulacja zostanie przeprowadzona zbyt szybko (nie jestem pewien, czy to realistyczny problem, ale jeśli świat kroczy przed upływem milisekundy, czas różnica zawsze wynosiłaby 0 i nic nie działałoby). Może też nie chce marnować pamięci na pływaki o wyższej precyzji.
jcora
1
Gry często wykorzystują podwójną grawitację? Mówi kto
GameDev-er
Nie mogę zmienić szybkości ani dokładności, ale spróbuję zmienić grawitację.
Mikael Högström,
Zmiana stałej grawitacji powoduje, że kostki poruszają się ogólnie szybciej, co sprawia wrażenie, że wszystko ma mniejszą skalę. To sprawia, że ​​zachowanie jest bardziej roztrzęsione, nawet w przypadku mikrokolekcji do obsługi przyspieszenia między klatkami. Chyba będę musiała go podkręcić :)
Mikael Högström
4

W przypadku problemów z małymi wartościami liczbowymi sugeruję, aby po prostu zmniejszyć wszystko. Możesz nawet nie używać „rzeczywistych” jednostek pomiarowych, ale tylko niektóre „ogólne” jednostki, które mają sens tylko w silniku.

Pierwsza opcja, zmniejszanie skali, wymagałaby użycia milimetrów lub centymetrów jako podstawowej jednostki miary. Zatem wymiary twojej kostki nie ucierpiałyby na utracie precyzji.

Drugie rozwiązanie to w zasadzie to samo, ale wtedy nie trzeba myśleć o rzeczywistych jednostkach.

A może po prostu zmienisz masę sześcianu?

jcora
źródło
Ponieważ jedyne generatory siły, jakie posiadam, to zmiana masy na podstawie grawitacji / akcelerometru nie zmienia zachowania. Twoja sugestia mogłaby być wykorzystana na odwrót (może to miałeś na myśli), nadając małym obiektom większą masę, zbliżając ich masy odwrotne do jednej, a tym samym zmniejszając niestabilność numeryczną. Daje to te same problemy, co tylko zwiększenie stałej grawitacji.
Mikael Högström,
0

Pomyślałem, że powinienem podzielić się moim ostatecznym rozwiązaniem problemu. Zwiększenie stałej grawitacji zgodnie z sugestią faktycznie spowodowało, że kostki poruszają się szybciej, co daje wrażenie prawidłowej skali. Zwiększyło to jednak problemy związane z mikrodrukowaniem. Dodałem mikrokolekcje, które złagodziły problem, choć nie rozwiązały go idealnie. Zauważ, że staje się to problemem tylko dla „małych” obiektów, jeśli masz problem z odwrotnością i chcesz symulować bardzo duże obiekty (statki kosmiczne lub coś w tym rodzaju), wtedy nie będziesz mieć żadnych problemów z mikroprzesunięciem i możesz z tym walczyć to rozwiązanie.

Znalazłem więc najwyższy poziom grawitacji, jaki mogłem mieć, bez nadmiernego „mikroprzaskania”. Następnie zastosowałem proste wykrywanie wstrząsów w telefonie, które zareagowało na duże zmiany odczytów akcelerometru i przyłożyło impulsy do wszystkich obiektów, gdy takie wstrząsy zostaną wykryte. Nie jest idealny, ale ponieważ sprawi, że kostki poruszą się szybko, gdy telefon zostanie potrząśnięty, sprawi wrażenie „małych” kostek. To trochę hack, ale trzeba będzie to zrobić :) Oto klip silnika w akcji.

Mikael Högström
źródło