Tworzę podstawową sztuczną inteligencję dla mojego side-scrollera i muszę wiedzieć, czy jednostka AI może dotrzeć do punktu B z punktu A po prostu wykonując skok.
Trajektoria lotu moich postaci jest nieco nietypowa, ponieważ mogą one zastosować siłę w powietrzu (jak na przykład w Jazz Jackrabbit 2), więc w przeciwieństwie do klasycznej trajektorii pocisku, która polega na ...
ścieżka, którą rzucony lub wystrzelony pocisk przejdzie (...) bez napędu.
... Przypuszczam, że mój problem dotyczy raczej pocisku z napędem (np. Rakiety).
Aby to zilustrować, tak wygląda krzywa lotu dla mojej postaci, gdy skaczę i ciągle naciskam „lewy przycisk” (wygląda inaczej na lewym końcu, tutaj robiłem manewry w powietrzu):
Siła przyłożona podczas lotu jest zawsze równoległa do osi X, więc jest to F = (-f, 0), jeśli trzymam „lewy”, a F = (f, 0), jeśli trzymam „prawy”.
Potrafi poruszać się bardzo jak skoczek narciarski:
Więc bardzo różni się od klasycznej trajektorii, która jest po prostu parabolą (źródło: wikipedia ):
Aby to utrudnić, symuluję prosty opór powietrza, aby moje postacie mogły przyspieszyć tylko do pewnej maksymalnej prędkości.
Odbywa się to poprzez zastosowanie niewielkiej siły w przeciwnym kierunku jazdy :
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( AIR_RESISTANCE_MULT * speed * speed * -vel, body->GetWorldCenter() );
AIR_RESISTANCE_MULT jest stałą, która w moim przypadku wynosi 0,1.
Załóżmy, że moja postać jest nieskończenie małą kwestią.
I NIE biorę pod uwagę przeszkód, więc moje pytanie brzmi tak ...
Jak określić (przynajmniej niezawodnie zgadnąć), biorąc pod uwagę prędkość początkową V, impuls J = (0, -j), który przykładam do postaci podczas skoku, grawitację G = (0, g) , siłę F = (+ -f , 0) stale stosowane podczas lotu i AIR_RESISTANCE_MULT, jeśli naprawdę zdecydujemy się uwzględnić opór powietrza (jest to opcjonalne) , czy punkt leży poniżej krzywej wyznaczonej przez ścieżkę, którą podąży moja postać?
Nie mam dosłownie pojęcia, od czego zacząć od obliczeń, a tak naprawdę niekoniecznie jestem zainteresowany dokładną odpowiedzią; dobrze działający hack / aproksymacja byłaby świetna, ponieważ AI w żadnym wypadku nie musi działać idealnie.
edycja: Zdecydowałem rozwiązać ten problem za pomocą symulacji, jak sugeruje Jason, ale jak sobie poradzić z takim przypadkiem?
Czy powinienem narysować odcinek od C do D i sprawdzić, czy pożądany punkt znajduje się poniżej tego odcinka?
A może powinienem binarnie przeszukiwać przedziały czasowe między C i D, aby znaleźć punkt, który jest wystarczająco blisko w odległości poziomej do żądanego punktu, a dopiero potem sprawdzić różnicę pionową? (wydaje mi się to trochę przesadne)