2012-12-15 10 views
5

Pracuję nad grą wyścigową dla szkolnego projektu. Korzystanie z Visual Studio 10 pro i Irrlicht. Przepraszamy za złą gramatykę..>, I jest to moje pierwsze pytanie, więc nie jestem pewien, czy to dobrze.Jak znaleźć obiekt przed punktem nawigacyjnym lub po nim?

Chcę, aby działało, że punkty na drodze robię w różnych punktach na torze, , a następnie uruchamiam kontrolę punktów na drodze, aby sprawdzić, czy samochód minął następny punkt nawigacyjny (następny, który "potrzebuje" do przejścia)), jeśli tak, to aktualizuje następny punkt drogi, inaczej nic.

Sposób, w jaki mam nadzieję, że to zadziała, polega na tym, że robię wektor od n do n + 1, a następnie znajduję wektor prostopadły do ​​pierwszego wektora w punkcie n. Wtedy widzę, czy obiekt znajduje się z przodu, czy z tyłu tego wektora. znalazłem Gamedev.net forumpost że pomógł mi zrobić tę funkcję:

void Engine::checkWaypoint(Vehicle* vehicle) 
{ 
    btVector3 vector = waypoints[vehicle->nextWaypoint]; 
    // n 
    btVector3 nextVector = waypoints[vehicle->nextWaypoint + 1]; 
    // n+1 
    vector = nextVector - vector; 
    // First vector 
    btVector3 pos = btVector3(vehicle->position.X,vehicle->position.Y,vehicle->position.Z); 

    float product = vector.dot(pos - waypoints[vehicle->nextWaypoint]); 
    // positiv = before, negative = behind 

    if(product < 0) 
    vehicle->nextWaypoint += 1; 
} 

Aktualne błędy w to:

  1. Aktualizuje nextwaypoint więcej niż te, bez przechodzenia obok nowego punktu.

  2. Po dojściu do końca i zresetowaniu zatrzymuje zatrzymywanie w pierwszych punktach trasy.

Więc moje pytania:

Czy jest to dobry sposób, aby to zrobić?

Czy zrobiłem to dobrze?

+0

Powinieneś [zaakceptować odpowiedź] (http://stackoverflow.com/faq#howtoask) lub skomentować otrzymane odpowiedzi, jeśli żadna z nich nie przekona Cię, aby uzyskać lepsze odpowiedzi. – Synxis

Odpowiedz

0

Okazało się, że mój oryginalny kod działał, problem dotyczył waypointów.

Ułatwiliśmy zobaczenie punktów na drodze i wszystkie były zbyt blisko siebie, więc kode powtarzał się wiele razy w tych samych miejscach.

Tak więc wydłużono dystans między punktami na drodze i utworzyłem je na torze, a wszystko zaczęło działać tak, jakbym tego chciała.

1

Zwykle w grze wyścigowej musisz być w punkcie kontrolnym, aby go zweryfikować: wystarczy sprawdzić, czy samochód jest wystarczająco blisko od punktu kontrolnego. Tak, myślę, że po pseudo-kod będzie poprawny:

if(car is_near current_checkpoint) 
    current_checkpoint = current_checkpoint->next_checkpoint; 

is_near: return distance(car, current_checkpoint) < some value 

dla testu na odległość, można użyć prosty kształt okręgu (jak pokazano w pseudo-kodzie), można też sprawdzić, czy w samochodzie trafia w obwiednię punktu kontrolnego (lub pole, które znajduje się wewnątrz punktu kontrolnego), w zależności od tego, w jaki sposób tworzone są twoje punkty kontrolne.

Albo możesz mieć krzywą utworzoną przez wszystkie linie od punktów kontrolnych do swoich obserwatorów, a następnie znaleźć najbliższą linię, na której się znajduje, z której można znaleźć następny punkt kontrolny. Przykład:

     o--o 
        / \ 
    o-----------------o  \ 
/      \ <-- your track: S = start 
/       o     E = end 
/  o---o  X /    o = checkpoint 
S  / \  . /     X = car 
     /  o------.----o 
    /    ^
    E--o     | 
       closest road from the car 

Niewygodne: wyniki mogą się różnić w zależności od krzywizny dróg. Radzę użyć pierwszej metody, którą opisałem.

+0

Twój kod nie pomógł w rozwiązaniu bieżącego problemu, ale pomógł mi z innym problemem, w którym miałem jeszcze jakiś inny kod. Dzięki za to –

1

Twój kod mierzy, jak daleko wzdłuż wektora od aktualnego punktu drogi do następnego, gracz jest. Jeśli jednak wektory dla dwóch kolejnych segmentów są (na przykład) pod kątem prostym, algorytm może pominąć wiele punktów drogi naraz. (tj. jeśli narysujesz linię przez następny punkt drogi, może ona rozciągać się w połowie drogi, co oznacza, że ​​gracz może jechać w przód i tył w poprzek, podczas jazdy w kierunku tego punktu).

Może działać pewna objętość ograniczająca, czyli odległość do punktu drogi (sprawdź, czy jest mniejsza niż może 2x szerokość drogi) lub odległość do wektora, który obliczyłeś między punktami.

(lub może uciec tylko dodając więcej punktów GPS)

Na pytanie dlaczego to nie działa, gdy kolanach, wydaje się po prostu dodać jeden z punktów trasy, aby znaleźć następny. Musisz wykonać to obliczenie modulo suma:

next_waypoint = (vehicle->nextWaypoint + 1) % num_waypoints; 
+0

Ahh Mod czek, wiedziałem, że zapomniałem coś. Dziękuję za to. –

Powiązane problemy