Grawitacja planety 2D


15

Staram się stworzyć prostą grę, w której wystrzeliwany jest statek kosmiczny, a następnie na jego ścieżkę wpływa grawitacja planet.

Podobne do tej gry: http://sciencenetlinks.com/interactives/gravity.html

Chcę wiedzieć, jak odtworzyć wpływ planet na statek kosmiczny w tej grze, aby statek kosmiczny mógł „okrążać” planetę, aby zmienić kierunek.

Udało mi się osiągnąć fałszywe wyniki, w których statek zapętla się w ogromnej elipsie wokół planety lub tylko nieznacznie wpływa na nią grawitacja planety za pomocą wektorów.

Z góry dziękuję.

ps Mam duże doświadczenie w programowaniu, ale nie mam nic wspólnego z twórcami gier.

Odpowiedzi:


15

W twoim przypadku jest statek kosmiczny, który porusza się pod wpływem grawitacji wszystkich planet. Każda planeta przykłada siłę równą „m1 * m2 / r ^ 2”, w której m1 i m2 reprezentują masy statku kosmicznego i planety, zaś r jest równe odległości euklidesowej planety i statku kosmicznego. wystarczy obliczyć sumę wszystkich sił przyłożonych do statku. z zasad Newtona wiemy, że „f = m * a”, gdzie f to całkowita siła przyłożona do obiektu, m to jego masa, a a to jego przyspieszenie. od tego momentu możesz przeczytać tę stronę, aby dowiedzieć się, jak używać przyspieszenia do obliczania prędkości i położenia w czasie.


+1 Ładne źródło, które połączyłeś, wyjaśniając metodę integracji Runge-Kutta czwartego rzędu i wszystko.
David Gouveia,

Obecnie moim problemem jest ścieżka, którą podąża statek kosmiczny. Potrzebuję, żeby było bardziej „podobne do gry”. Zrobiłem prosty obraz, aby pokazać, co mam na myśli. i44.tinypic.com/2w2kdo4.jpg A jest tym, co mam teraz, B jest tym, czego chcę.
upieczony

@baked: a zwiększenie masy planety nie zadziałałoby?
Jesse Emond

5
Oprócz artykułu Gaffer on Games absolutnie musisz przeczytać ten artykuł Codeflow ! Runge-Kutta nie wygląda tutaj na twój najlepszy zakład.
sam hocevar,

Jeśli masz A i chcesz B, co powiesz na zmniejszenie początkowej prędkości swojego statku kosmicznego?
Ben

4

Każda planeta powinna mieć pole grawitacyjne, które ciągnie dowolny obiekt w pobliżu w kierunku jego środka. Innymi słowy, powinieneś przykładać siłę z pozycji statku kosmicznego do centrum planety na każdym etapie symulacji.

Siła ta zależy od masy obu obiektów, ale w tym przypadku, ponieważ masa statku kosmicznego jest prawdopodobnie nieznaczna w porównaniu z planetą, możesz po prostu wypróbować inną stałą w zależności od wielkości planety, dopóki nie poczujesz się dobrze.

Co najważniejsze, siła ta maleje wraz ze wzrostem odległości między oboma obiektami. Zrobisz to dzieląc dzielącą odległość między nimi. Po pewnym dystansie możesz chcieć „ręcznie” odciąć i przestać przykładać siłę.

Wystarczy przełożyć tę siłę na przyspieszenie, a pozostałe równania fizyczne zajmą się resztą.

W pseudokodzie

force=0
for each planet
    if distance < constant
        force += mass * (planet.xy - ship.xy) / distance^2
apply force to ship

W rzeczywistości jest to dość podobne do tego, co robię obecnie. Może to tylko kwestia gry ze stałymi?
upieczony

2
Nie jestem do końca pewien, ale powiedziałbym, że to chyba tylko poprawianie. I myślę, że zależy to również od początkowej siły, jaką przykładasz do statku kosmicznego, aby dostać się na orbitę.
David Gouveia,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.