2012-12-15 5 views
5

Sto lavorando a un gioco di corse per un progetto scolastico. Utilizzo di Visual Studio 10 pro e Irrlicht. Ci scusiamo per la grammatica cattiva>.>, Ed è la mia prima domanda, quindi non sono sicuro che sia stata eseguita correttamente.Come trovo se un oggetto è prima o dopo un waypoint?

Come voglio che funzioni è che faccio waypoint in diversi punti della traccia, e poi eseguo il controllo dei waypoint per vedere se una macchina ha superato il suo prossimo waypoint (la successiva "ha bisogno" di andare oltre), se sì, aggiorna il waypoint successivo, altrimenti niente.

Il modo in cui spero che questo funzioni è, faccio un vettore da n a n + 1, quindi trova il vettore che è perpendicolare al primo vettore su n. Poi vedo se l'oggetto è davanti o dietro quel vettore. Ho trovato un Gamedev.net forumpost che mi ha aiutato a rendere questa funzione:

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; 
} 

bug correnti con questo è:

  1. Aggiornamenti del nextwaypoint più di quelli senza andare oltre un nuovo punto.

  2. Quando arriva alla fine e si reimposta, interrompe il trigger sui primi waypoint.

Così le mie domande:

questo è un buon modo per fare questo?

Ho fatto bene?

+0

Si dovrebbe [accettare una risposta] (http://stackoverflow.com/faq#howtoask), o commentare le risposte fornite se nessuno ti sta convincendo, al fine di ottenere risposte migliori. – Synxis

risposta

0

Ho scoperto che il mio codice originale funzionava, il problema era con i waypoint.

Ha reso i waypoint facili da vedere e tutti erano troppo vicini l'uno all'altro, quindi il kode si ripeteva molte volte negli stessi punti.

Così ha reso più lunga la distanza tra i waypoint e li ha trasformati in una traccia, e tutto ha iniziato a funzionare come volevo anche io.

1

Di solito, in un gioco di gara devi essere al checkpoint per essere convalidato: basta controllare che l'auto sia abbastanza vicina al checkpoint. Quindi, penso che il seguente pseudo-codice sarebbe valida:

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

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

Il per la prova della distanza, è possibile utilizzare una semplice forma di cerchio (come mostrato in pseudo-codice), oppure si può verificare se l'auto colpisce il riquadro di delimitazione del checkpoint (o una casella che si trova all'interno del checkpoint), dipende da come vengono effettuati i checkpoint.

Oppure si può avere una curva composta da tutte le linee dai checkpoint ai propri follower, quindi trovare la riga più vicina su dove si trova, da cui è possibile trovare il checkpoint successivo. Esempio:

     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 

Scomodo: i risultati possono variare in base alla curvatura delle strade. Ti consiglio di usare il primo metodo che ho descritto.

+0

Il tuo codice non ha aiutato con il problema attuale, ma mi ha aiutato con un altro problema che avevo alcuni erano inn inn il mio codice. Grazie per l'assegno –

1

Il codice misura quanto lungo il vettore dal punto di passaggio corrente al successivo, il giocatore è. Tuttavia se i vettori per due segmenti consecutivi sono (per esempio) ad angolo retto, l'algoritmo potrebbe saltare più waypoint alla volta. (se si disegna la linea attraverso il prossimo way-point, potrebbe estendersi proprio in mezzo alla strada, il che significa che il giocatore potrebbe andare avanti e indietro su di esso, mentre si guida verso quel way-point).

Potrebbe funzionare una certa quantità di volume limite, ovvero la distanza dal waypoint (verificare che sia inferiore a 2 volte la larghezza della strada) o la distanza dal vettore calcolato tra i punti.

(o si potrebbe uscire solo con l'aggiunta di più waypoint)

Per quanto riguarda il motivo per cui non funziona quando si giro, sembra che si aggiunge solo uno per i waypoint per trovare quello successivo. È necessario eseguire tale calcolo modulo il totale:

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

Ahh, sapevo di aver dimenticato qualcosa. Grazie per quello. –