Ricerca di percorsi 2D: ricerca di percorsi fluidi


10

Stavo cercando di attuare un semplice pathfinding, ma il risultato è meno soddisfacente di quello che intendevo ottenere. Il fatto è che le unità in giochi come Starcraft 2 si muovono in tutte le direzioni mentre le unità nel mio caso si muovono al massimo in 8 direzioni (stile Warcraft 1) poiché queste 8 direzioni si dirigono verso i nodi disponibili successivi (si spostano da una tessera alla prossima tessera vicina) . Cosa devo fare per ottenere il risultato come in Starcraft 2? Ridurre le dimensioni della piastrella?

http://i.stack.imgur.com/lr19c.jpg

Nella foto puoi vedere una linea orizzontale di tessere di roccia come ostacoli e il percorso trovato contrassegnato come tessere verdi. La linea rossa è il percorso che voglio raggiungere.


Sono un grande fan della ricerca dei punti di salto, anche se non ho ancora trovato il tempo per implementarlo. Ma la documentazione era interessante e ha una buona prestazione.

2
Sei sicuro che sia il tuo percorso desiderato? Le unità che lo usano attraverseranno parzialmente i muri. L'ho reso più visibile in un altro esempio: i.imgur.com/eh4ZR.png Ed ecco cosa probabilmente vorresti davvero ottenere: i.imgur.com/vFQg4.png
Markus von Broady

Hai ragione, il mio percorso era imperfetto, ma era più a scopo illustrativo, grazie per indicare il modo migliore di esaminare.
Kooi Nam Ng,

Dovrai avere coordinate frazionarie all'interno di una tessera per ottenere ciò che desideri. Nessun percorso possibile senza questo funzionerebbe: trasportare le frazioni ma non visualizzarle farebbe muovere l'unità dritta / diagonale / dritta / diagonale.
Loren Pechtel,

@LorenPechtel ti sbagli, puoi lisciare il percorso dopo averne trovato uno. È abbastanza facile quando crei due linee in base alle dimensioni dell'unità e controlli se si intersecano con le tessere tra tile0 e tileN, dove tile1-tile (N-1) sono le tessere che desideri rimuovere dal percorso.
Markus von Broady,

Risposte:


8

Per un buon algoritmo di pathfinding, usare A * sarebbe probabilmente una buona idea, tuttavia, per un gioco semplice che non richiede una ricerca di percorso sofisticata, efficiente o efficace, semplicemente facendo muovere i personaggi verso un bersaglio scoprendo la direzione di l'obiettivo dovrebbe essere sufficiente.

Puoi fare è generare un 'grafico di visibilità' (quali altri punti sono visibili da ciascun punto) dai vertici e quindi eseguire A * sul grafico. Questo funziona perché il percorso più breve si troverà sempre sul grafico di visibilità.

Ridurre le dimensioni della piastrella può aiutarti.

risorse

Ulteriori letture

EDIT: Mi piace il commento di MarkusvonBroady.

"In realtà si tratta di smussare il percorso, non di trovarlo. Il percorso trovato nell'immagine sembra OK."

risorse

Da @MarkusvonBroady

Ho fatto una ricerca, ho trovato i seguenti (quelli potrebbero aiutarti)


1
ottimi collegamenti, +1 da parte mia
lhk,

2
@MarkusvonBroady, grazie per -1. Ho imparato da te Non voglio punto, piuttosto sono disposto a imparare e condividere quello giusto. Credo discutendo che possiamo trovare quello giusto. :)
Md Mahbubur Rahman,

@MarkusvonBroady, ti piacerebbe condividere diverse risorse dell'algoritmo di smussamento del percorso?
Md Mahbubur Rahman,

In realtà, penso che questa risposta aiuti l'OP. Non penso che l'OP chiedesse un livellamento effettivo (interpolazione spline o simili) ma piuttosto che il suo algoritmo sta attualmente trovando un percorso orribilmente non ottimale e deve essere "livellato" in una linea più dritta. Quale A * avrebbe naturalmente trovato per lui senza ulteriore levigatura.
Sean Middleditch il

Avevo usato A * e penso di aver trovato il percorso ottimale.
Kooi Nam Ng,

0

A partire da un'estremità del percorso non elaborato, ad esempio path[0], è possibile rimuovere path[1]se il segmento formato unendo i punti di path[0]e path[2]NON interseca alcun muro. Andare oltre fino all'ultimo segmento fornirà un percorso più semplice.

Questo non solo livellerà il tracciato, ma rimuoverà anche alcuni punti inutili, come ad esempio il fuoco, 3 segmenti consecutivi di una linea retta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.