Odpowiedzi:
Najprostszym sposobem jest integracja Eulera. Musisz zapisać wektor pozycji i wektor prędkości. W każdej ramce:
( x dla skalarów, X dla wektorów)
upewnij się, że dt jest mały ...
| G | wynosi około 9,8 m / s² dla ziemi i około 1,6 m / s² dla księżyca
ogólnie siła oddziałująca z powodu oddziaływania grawitacyjnego wynosi:

Wpływa na każde ciało i wskazuje na drugie.
G skalarną jest bardzo znany stała grawitacyjna jest o 6.67e-011 N (m / kg) ²
Ponieważ jesteś zainteresowany przyspieszeniem:

Musisz tylko znać masę planety (m2) i promień (r), aby obliczyć swoje przyspieszenie.
Zazwyczaj przyspieszenie, które przesuwa planetę w kierunku twojego statku kosmicznego, jest nieznaczne, ponieważ zwykle m1 jest nieznaczne w porównaniu do m2.
Jeśli jednak próbujesz wylądować na małej asteroidzie, prawdopodobnie musisz użyć ogólnej formuły dodającej tę siłę do wektora siły całkowitej w drugim etapie.
EDYTOWAĆ:
Zgodnie z wymaganiami podpowiedź na temat implementacji. Będziesz potrzebować:
Przede wszystkim biblioteka wektorów: twoja gra może być mono / bi / tree / four ... wymiarowa, o ile uważasz, że twoja skrzynka jest projekcją słowa 3D, fizyczne roule trzymają.
Jeśli n jest wybranym przez Ciebie wymiarem (prawdopodobnie 2 lub 3 w twoim przypadku), biblioteka musi mieć:
Możesz użyć biblioteki, która to robi lub zaimplementować ją samodzielnie; wektor może być strukturą lub klasą, wybór należy do ciebie.
Każdy silnik powinien być opisany przez:
Twój wkład użytkownika zostanie wykorzystany do podania każdemu silnikowi liczby, która będzie między 0 (nieużywany silnik) a 1 (pełna moc): współczynnik silnika (zużycie).
Pomnóż współczynnik silnika dla jego wektora ciągu, aby uzyskać prawdziwe zaufanie silnika i zsumować wszystkie wyniki wszystkich dostępnych silników; to da ci F drugiego kroku.
Współczynnik silnika można wykorzystać do określenia rzeczywistego zużycia paliwa dla każdego silnika: pomnóż współczynnik silnika przez zużycie paliwa i przez dt, aby poznać chwilowe zużycie paliwa; możesz odjąć tę wartość od zmiennej całkowitej pojemności paliwa (daje to możliwość zaktualizowania całkowitej masy m, jeśli masa paliwa jest znaczna).
Teraz możesz kontynuować korzystanie z integracji w celu obliczenia nowej pozycji, sprawdź kolizję z powierzchnią twojej planety; jeśli występuje, użyj długości wektora prędkości, aby powiedzieć, czy lądowanie zakończyło się sukcesem czy katastrofą.
Oczywiście można / należy wykonać inne kontrole kolizji, niektóre obiekty powierzchniowe nie mogą być dozwolone jako punkt lądowania, więc każda kolizja jest śmiertelna.
Pozostawiam, jak uzyskać wkład i jak oddać wam swój statek kosmiczny; możesz na przykład użyć współczynnika silnika do renderowania stanu silnika klatka po klatce.
Ponieważ druga doskonała odpowiedź wydaje się nieco teoretyczna, oto prosta wersja kodu:
// Position of the lander:
var positionX = 100.0;
var positionY = 100.0;
// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;
// Acceleration due to gravity
var gravity = 1.0;
// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;
// Thrust acceleration
var thrust = -2.0;
// Vertical position of the ground
var groundY = 200.0;
// Maximum landing velocity
var maxLandingVelocity = 3.00;
onUpdate()
{
velocityY += gravity;
positionX += velocityX;
positionY += velocityY;
if (isThrusting)
{
velocityY += thrust;
}
if (isThrustingLeft)
{
velocityX += thrust;
}
else if (isThrustingRight)
{
velocityX -= thrust;
}
if (positionY >= floorY)
{
if (velocityY > maxLandingVelocity)
{
// crashed!
}
else
{
// landed successfully!
}
}
}
Niestety, matematyka tutaj staje się owłosiona. Odpowiedź FxIII jest dobra dla ogólnego przypadku spadającego obiektu, ale mówisz o rakiecie - i rakiety spalają paliwo.
Widziałem kod, który to robi, ale był całkowicie nieudokumentowany i nigdy nie udało mi się zrozumieć matematyki. Chyba że masz jakieś ograniczenia procesora, nie zawracałbym sobie głowy i po prostu brutalną siłą - podejście FxIII zastosowane w dość krótkim przedziale czasu i wyregulowanie ciągu (lub zużycia paliwa, jeśli zorientujesz się, że rakieta dławi się, gdy paliwo pali się, aby utrzymać określone przyspieszenie zamiast określonego ciągu) między każdą iteracją, gdy rakieta spala paliwo.