Jak obliczyć prędkość opadania i przyspieszania?

9

Zastanawiam się nad stworzeniem lądownika, w którym kontrolujesz statek kosmiczny i musisz wylądować bez rozbicia. Jaka jest prosta formuła do obliczania prędkości spadania lub przyspieszenia w odniesieniu do czasu pracy silników do czasu?

Dvole
źródło

Odpowiedzi:

28

Najprostszym sposobem jest integracja Eulera. Musisz zapisać wektor pozycji i wektor prędkości. W każdej ramce:

  • mierzyć czas, jaki upłynął od ostatniego kroku integracji: dt
  • obliczyć siłę vecor z powodu silników: F
  • obliczyć wektor przyspieszenia: A = F / m, gdzie m jest masą statku kosmicznego.
  • dodaj wektor grawitacji: A = A + G upewnij się, że G wskazuje w kierunku środka planety
  • zaktualizuj wektor prędkości V = V + A · dt
  • zaktualizuj wektor pozycji X = X + V · dt

( 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:

Prawo powszechnej grawitacji Newtona

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:

Przyśpieszenie

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ć:

  • Biblioteka wektorowa
  • Model silnika
  • Model fizyki
  • Wykrywanie kolizji
  • Interfejs użytkownika (wprowadzanie i renderowanie grafiki)

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ć:

  • jednostka przechowywania wektorów (lista n liczb zmiennoprzecinkowych dla każdego wektora)
  • operator sumy (suma komponent po komponencie)
  • skalarny operator mnożenia (każdy element pomnożony przez liczbę zmiennoprzecinkową)
  • mnożenie kropek między wektorami (mnożenie komponentu przez komponent i sumowanie wszystkich)
  • długość wektora (pierwiastek kwadratowy wektora pomnożonego przez siebie)

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:

  • wektor wskazujący jego siłę i kierunek ciągu
  • skalar wskazujący zużycie paliwa na sekundę przy pełnej mocy;

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.

FxIII
źródło
To świetnie, ale byłoby kilka pomysłów na ulepszenie kodu.
Dvole
1
gdzie nauczyłem się fizyki shiffman.net/teaching/nature
Ming-Tang
Ten facet zna swoją fizykę!
MGZero
7

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!
        }
    }
}
Iain
źródło
2
Prostota. Spodziewam się, że jest to zgodne z tym, czego szukał.
Beska
2

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.

Loren Pechtel
źródło
Wychodzenie z paliwa reprezentuje tylko spadający parametr. To po prostu siła wektorowa o malejącej wartości. Czy się mylę? W prostym przypadku masz G przeciwko F, ​​gdzie F jest silnikiem rakiety, a G grawitację ziemi: W tym przypadku musisz po prostu zmierzyć oba względem siebie, więc jeśli nie pozostanie paliwo, F spada do 0, więc tylko trzeba zastosować G jako siłę wektorową na swoim obiekcie. Działa dla każdej wartości F. Tak długo, jak F> = G obiekt „powinien” poruszać się w kierunku F.
daemonfire300 14.07.11
2
@ daemonfire300: Nie rozumiesz - nie mówię o efekcie wyczerpania paliwa, ale o skutku spalania paliwa. Stałe ustawienie przepustnicy w silniku powoduje ciągłe przyspieszenie, stałe przyspieszenie powoduje stale malejące tempo spalania paliwa. Oznacza to, że proste obliczenia, które podaje FxIII, spowodują podanie nieprawidłowych liczb zużycia paliwa.
Loren Pechtel
Wielkość przyrostu przyspieszenia od A = F / M podczas spalania paliwa będzie nieistotna, chyba że stosunek masy paliwa do pojazdu jest absurdalnie wysoki lub szybkość spalania paliwa jest podobnie wysoka. W końcu to gra.
Patrick Hughes,
@Patrick Hughes: Ilość paliwa przewożona przez jakikolwiek prawdziwy lądownik rakietowy (nie liczę przypadków aerobrake / hybrydy rakietowej Marsa) stanowi znaczną część jego całkowitej masy. Zakładając, że ustalony stosunek paliwa: przyspieszenia da bardzo błędną odpowiedź.
Loren Pechtel
1
To nie jest odpowiedź na pytanie, tylko komentarz do odpowiedzi @ FxIII.
Jonathan Connell