Ok, więc rozważmy, że mamy pojazd podobny do opisanego w mojej odpowiedzi na to pytanie , z pozycją 2D, prędkością, prędkością kątową i oporem / tarciem. Może przyspieszać i przebijać się o różną ilość, ale nie może natychmiast zatrzymać martwego lub osiągnąć maksymalnej prędkości natychmiast. Jak mogę sprawić, aby przesunął się do określonego punktu i zatrzymał - w możliwie najkrótszym czasie - bez przeregulowania lub oscylacji?
Myślałem o czymś takim:
- skręcić w kierunku pozycji docelowej.
- przyśpieszyć
- spójrz 1 zaznacz przed siebie, pytając „Gdybym zastosował przerwy w następnym tiku, czy przekroczyłbym cel?”
- Jeśli to się przekroczy, zastosuj teraz przerwy o pewną kwotę.
Jestem pewien, że jest to rozwiązany problem i istnieje prawdopodobnie lepsza metoda niż ta, którą opisałem.
Korzystając z rachunku różniczkowego, jeśli znasz swoją prędkość i maksymalną prędkość hamowania, możesz poznać swoją minimalną drogę hamowania. Mając to na uwadze, możesz dokładnie wiedzieć, kiedy musisz zwolnić hamulce (pomijając błędy zaokrąglania / kwantyzacji), aby zatrzymać się w pewnym momencie.
Mam nadzieję, że ktoś lepszy w matematyce ode mnie opublikuje formułę ...
źródło
finalPositionDelta = -0.5 * sqr(currentSpeed) / maximumDeceleration
Zakłada się jednak, że opóźnienie jest stałe, co w zależności od głębokości symulacji może nie mieć miejsca. Poszedłbym z rozwiązaniem Ranieri. (niestety, to spowolnienie DIV, nie mul)To problem z kontrolą. Musisz różnicować dane wejściowe proporcjonalnie do pewnego rodzaju „błędu”, na przykład odległości do celu. Zobacz także odpowiedzi na to pytanie.
Śledzenie celu: kiedy przyspieszać i zwalniać obrotową wieżę?
źródło
Czasami podczas tworzenia gry musisz używać skrótów. Skrót tutaj nazywa się Impulsem, który fizycznie jest bardzo dużą siłą przyłożoną w bardzo krótkim czasie. Zamiast integrować go w czasie, po prostu zastosujesz go do parametru jako bezpośrednią zmianę: ustaw prędkość na 0.
Pytanie brzmi: czy chcesz użyć skrótu, czy nie?
źródło