Come rendere i miei personaggi più fluidi mentre camminano su un percorso (elenco di coordinate)?


15

Ho un elenco con coordinate - output dall'algoritmo A * - e vorrei che i miei personaggi seguissero senza problemi questo percorso con rotazioni.

Quindi ho qualcosa come A e voglio ottenere C

inserisci qui la descrizione dell'immagine

Come posso fare questo ?

MODIFICARE

Per rendermi un po 'più chiaro:

Sono più interessato alle curve morbide poiché so già come camminare da un nodo all'altro.

MODIFICARE

Poiché molte persone lo trovano utile (anche io) sto pubblicando un link a "Natura del codice" di Daniel Shiffman, dove discute molti problemi di intelligenza artificiale (e fisica) del gioco, ad es. Comportamenti di guida http://natureofcode.com/book/chapter- 6-autonome-agenti / # chapter06_section8


Il pathfinding non è integrato in Unity?
joltmode

@ Tom Beh, sì, ma ho comunque implementato la mia versione. Il punto di questa domanda è ottenere curve regolari (rotazioni) mentre si cammina sul sentiero.
Patryk,

3
Un buon termine a Google in questo senso è "Comportamento dello sterzo" :)
Roy T.

3
@RoyT. Ovviamente ! Ho letto questo alcune settimane fa e ho già dimenticato: / Questo è un grande articolo sul percorso che segue con una fantastica spiegazione matematica + fisica natureofcode.com
Patryk

1
Volevo solo ringraziare @Patryk per il link: sembra davvero informativo e ho cercato una buona risorsa sul comportamento di guida.
Christian

Risposte:


7

Se si desidera tracciare percorsi uniformi in un ambiente basato su riquadri, non è possibile applicare un certo livellamento del percorso sui waypoint A *. Nel suo libro sul gioco di programmazione AI, Matt Buckland descrive un algoritmo semplice e veloce per smussare un percorso (sostanzialmente rimuovere tutti i bordi che possono essere rimossi senza causare un'intersezione con i tuoi ostacoli).

Dopo aver rimosso i bordi non necessari in questo modo, il primo caso ( A -> B ) è risolto. Il livellamento dei bordi nel grafico potrebbe essere realizzato in diversi modi. Molto probabilmente, le spline di Hermite funzionerebbero (a seconda della densità dell'ostacolo e della dimensione delle piastrelle). Un'altra opzione potrebbe essere rappresentata dai comportamenti di governo, in cui inizi a guidare verso il waypoint successivo, non appena ti trovi a mezzo riquadro di distanza dal bersaglio attuale (questo dipende in realtà dalla velocità con cui il tuo "agente" si muove / gira).


9

Come altri hanno già detto, per il secondo caso dovrai implementare una sorta di spline o (in realtà una misura migliore per il tuo esempio) dare all'unità una sorta di comportamento di guida.

Tuttavia, per il primo caso, esiste una soluzione che è sia più semplice che offre risultati migliori rispetto al livellamento del percorso. Si chiama Theta * ed è una semplice (e relativamente nuova) estensione di A * sulle griglie che consente alle unità di muoversi in qualsiasi direzione tra i punti della griglia.

Theta * vs. livellamento del percorso

C'è un bell'articolo che spiega Theta * (da cui ho rubato l'immagine sopra) qui


2

Per un movimento più umano realistico, prova a integrarti con Comportamenti di guida. (Versione C # del classico OpenSteer http://sharpsteer.codeplex.com/ ) Ottieni l'output di AStar e lascia che il comportamento dello sterzo si preoccupi della movimentazione (Uno dei campioni mostra esattamente come farlo, naviga seguendo un percorso)


1

In caso di navigazione da un punto all'altro, ho usato la differenza di angoli (direzione attuale del giocatore rispetto alla direzione dal punto corrente al punto successivo) e poi ho gradualmente cambiato l'angolazione all'angolo finale man mano che si verifica il movimento. Dai un'occhiata a questo gioco qui in cui gli aeroplani si spostano da un punto all'altro, ma il turno non è brusco, ma osservando attentamente si possono identificare i punti del percorso. (il gioco funziona solo su dispositivi mobili sebbene preferibilmente iPhone / iPad).


Questo è esattamente quello che ho finito per fare.
Patryk,

1

Ho avuto fortuna con le spline Catmull-Rom (un tipo di spline cubica come raccomandato anche da @bummzack). La parte buona di questi è che la spline passerà sempre attraverso i punti di controllo, molti altri no. Implementa qualcosa del genere:

t    = <time*>
t12  = t + 1.0
t23  = t
t34  = t - 1.0
t123 = (t + 1.0) / 2.0
t234 = t / 2

c1 = controlpoint[0];
c2 = controlpoint[1];
c3 = controlpoint[2];
c4 = controlpoint[3];

l12 = lerp(c1, c2, t12);
l23 = lerp(c2, c3, t23);
l34 = lerp(c3, c4, t34);
position = lerp(lerp(l12, l23, t123), lerp(l23, l34, t234), t);

* il tempo è un valore [0,1] tra i punti di controllo 1 e 2.


0

A-> B può essere risolto utilizzando le mesh di navigazione anziché una griglia. Ciò implica un grande cambiamento nella generazione dei dati di pathfinding.

Casi come C e D stanno solo tagliando l'angolo: se il personaggio si muove in un percorso e all'interno di un "angolo" (cella in cui le celle precedente, corrente, successiva non si trovano su una linea retta), spingila in direzione sia della cella precedente che successiva . L'unico problema è determinare la distanza dalla posizione reale (la distanza di spinta). Ciò richiederebbe probabilmente la distanza dalla cella corrente come input. Qualcosa come questo:

push_dir = average( prevcell.pos, nextcell.pos ) - curcell.pos;
push_dist = cell_half_width - distance( char.pos, curcell.pos );
char.pos += push_dir * push_dist;
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.