Pathfinding su una superficie planetaria irregolare


16

La mia domanda è: quale sarebbe l'approccio migliore per l'individuazione di percorsi su una superficie planetaria irregolare?


Informazioni di base

Ho creato un pianeta da mappatura di spostamento 6 piani proiettati sfera. Inizialmente i piani formavano un cubo prima di essere proiettati in una forma a sfera.

inserisci qui la descrizione dell'immagine

Mi chiedo se sia possibile utilizzare ogni "faccia cubica proiettata a sfera" come griglie e utilizzare un semplice algoritmo A * per trovare il percorso migliore, vorrei anche che l'altezza di spostamento fosse presa in considerazione in modo che il percorso evitasse di arrampicarsi montagne ecc. (Immagino che questo sarebbe solo un euristico all'interno dell'algoritmo A *) Un'altra considerazione è che ho raggiunto il movimento planetario sfruttando il motore fisico di Unity3d, applicando la gravità verso il centro del pianeta. La mia soluzione proposta richiederebbe che il movimento degli agenti sia controllato indipendentemente dalla fisica gravitazionale.

Per aiutare a articolare meglio la mia domanda, questo è il mio attuale corpo planetario:

inserisci qui la descrizione dell'immagine


2
Potresti essere interessato a questo video di Planetary Annihilation. Sembrano fare lo stesso che tu avvolgi il mondo da un cubo e il percorso che lo circonda. Non è proprio una risposta, ma puoi vedere che stanno usando A * insieme ad alcune altre strategie per ottimizzare la ricerca del percorso intorno a una sfera. Il bit di ricerca del percorso inizia alle 24:30 .
MichaelHouse

@ Byte56 Grazie per questo link approccio davvero interessante ai costi, non vedo l'ora di vedere quel gioco quando è finito!
Caius Eugene,

Risposte:


12

Sembra che tu abbia già risposto alla tua domanda. A * è probabilmente l'approccio migliore. Sì, certo, può essere usato nel modo in cui descrivi, incluso l'uso delle informazioni sull'altezza per evitare le montagne. Finché sei in grado di accedere alle informazioni su qualsiasi griglia sulla superficie del tuo mondo, non c'è motivo per cui non puoi usarlo nell'euristica A *.

Infine, stai confondendo la ricerca del percorso con il percorso che segue alla fine della domanda. La ricerca del percorso non si preoccupa della gravità, a meno che non venga aggiunta come euristica e poiché si è sulla superficie di un pianeta, la gravità sarà essenzialmente la stessa su tutta la superficie. Molti giochi hanno gravità insieme al movimento, non vedo alcun motivo per cui non puoi.

Fondamentalmente vogliamo mappare andando dal rosso al blu, per essere lo stesso su una sfera come su un cubo.

inserisci qui la descrizione dell'immagine

Poiché A * sta spesso avvicinando i vicini al nodo corrente, è possibile creare facilmente una serie di funzioni per ottenere nodi adiacenti. Ad esempio, getXPlus(), getXMinus(), getZPlus()e così via. Queste funzioni prenderanno il nodo corrente e restituiranno il nodo nella direzione specificata dal nome della funzione.

Il più delle volte queste funzioni possono semplicemente incrementare un valore ed essere eseguite, tuttavia, sui bordi, che cambieranno.

Ti consigliamo di mappare la superficie del cubo su un sistema di coordinate 2D. Comunque tu faccia questo, non devi allinearti, basta dare ad ogni spazio della griglia una coordinata X, Y unica.

Ora, quando si è su un bordo, e ottenendo lo spazio griglia adiacente, non sarà necessariamente solo incrementare le coordinate. Dobbiamo scoprire su quale faccia ci stiamo spostando e passare alle coordinate di quella faccia.

Ad esempio, ottenere le coordinate XPlus qui cambierà sia le coordinate X che Y perché ci stiamo spostando su un nuovo spazio griglia su una nuova faccia. La linea verde rappresenta un bordo tra due facce.

inserisci qui la descrizione dell'immagine

Ora si tratta solo di coordinate globali, potrebbe essere più semplice utilizzare un sistema di coordinate locale interno, con una terza dimensione che rappresenta la faccia del cubo in cui ci si trova attualmente.

In entrambi i casi, è necessario disporre di una coordinata univoca per ogni spazio della griglia sulla faccia del cubo. La traversata dipenderà da come si implementa il sistema di coordinate. Devi sapere dove si trovano anche quelle coordinate sulla superficie della sfera.

Tutto questo alla fine dovrebbe essere sottratto in modo da non saperlo nemmeno.


Saluti per la risposta. Penso che ciò con cui sto lottando è che ogni piano sia una griglia isolata. Avresti qualche suggerimento (o ulteriore lettura) su come gestire le cuciture, immagino che dovrò dispiegare matematicamente il mio "cubo", combinare tutte le griglie e calcolare il percorso usando quel set di dati?
Caius Eugene,

In realtà sono solo i bordi di cui devi preoccuparti. Questo è facilmente risolto da una funzione wrapper (avvolgendo il cubo in una funzione wrapper, che avvolge il tuo mondo ...). Puoi astrarre il cubo in una superficie piana che si avvolge. Crea funzioni per ottenere lo spazio griglia adiacente, getXPlus () otterrà la griglia nella direzione XPlus, non importa se si trova sul confine tra le facce, la funzione cambierà semplicemente facce e restituirà le informazioni sulla griglia appropriate.
MichaelHouse

L'unica inesattezza con la ricerca del percorso sul cubo piegato è che i vertici sono inclinati e quindi i bordi hanno lunghezze diverse. È possibile che non faccia una differenza evidente nei percorsi risultanti e altrimenti potresti semplicemente prendere in considerazione le lunghezze.
danijar,

1
La cosa importante da capire qui è che A * non opera necessariamente su un piano; opera su un grafico. Sebbene all'interno di ciascuna faccia del cubo, i nodi siano disposti e collegati in una griglia, ci sono anche connessioni ai nodi attraverso i bordi del cubo.
Jmegaffin,

1
@ Byte56 Grazie per l'ottima risposta, ho iniziato a implementare una soluzione, ma ho raggiunto un po 'di blocco. Forse ho frainteso. Ho pubblicato una domanda su StackOverflow poiché ho sentito che si trattava più di un problema di matematica / programmazione StackOverflow.com/questions/16089074/…
Caius Eugene
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.