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.
źródło
Odpowiedzi:
Mógłbyś
źródło
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?
źródło
Biblioteka Bullet Physics ma stronę wiki o skalowaniu świata fizyki . Ta informacja jest prawdopodobnie przydatna również w przypadku innych silników fizyki.
źródło
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.
źródło