Comprensione dei comportamenti dello sterzo fuggire e arrivare

I comportamenti di guida mirano ad aiutare i personaggi autonomi a muoversi in modo realistico, usando forze semplici che si combinano per produrre una navigazione improvvisa e realistica. In questo tutorial, tratterò il fuggire comportamento, che fa allontanare il personaggio da un inseguitore, e il arrivo comportamento, che rallenta il personaggio e si ferma quando si avvicina a un bersaglio.

Nota: Sebbene questo tutorial sia scritto usando AS3 e Flash, dovresti essere in grado di utilizzare le stesse tecniche e concetti in quasi tutti gli ambienti di sviluppo di giochi. Devi avere una conoscenza di base dei vettori di matematica.


Scappare via

Il comportamento di ricerca descritto in precedenza si basa su due forze che spingono il personaggio verso il bersaglio: la velocità desiderata e lo sterzo.

desired_velocity = normalize (target - position) * max_velocity steering = desired_velocity - velocity

Il desired_velocity, in questo caso, è il percorso più breve tra il personaggio e il bersaglio. Viene calcolato sottraendo la posizione del bersaglio dalla posizione del personaggio. Il risultato è un vettore di forza che va dal personaggio verso il bersaglio.


Cerca un comportamento

Il comportamento di fuga usa le stesse due forze, ma sono regolate per far funzionare il personaggio lontano dall'obiettivo:


Fuggi comportamento

Quel nuovo desired_velocity il vettore viene calcolato sottraendo il personaggi posizione dal L'obiettivo di posizione, che produce un vettore che va dal bersaglio verso il personaggio

Le forze risultanti sono calcolate quasi nello stesso modo del comportamento di ricerca:

desired_velocity = normalize (position - target) * max_velocity steering = desired_velocity - velocity

Il desired_velocity in quel caso rappresenta la via di fuga più facile che il personaggio può usare per scappare dall'obiettivo. La forza di governo fa sì che il personaggio abbandoni il suo percorso corrente, spingendolo verso la direzione del vettore di velocità desiderato.

Confrontando il vettore di velocità desiderato del comportamento di fuga con il vettore di velocità desiderato del comportamento di ricerca, è possibile stabilire la seguente relazione:

flee_desired_velocity = -seek_desired_velocity

In altre parole, un vettore è il negativo dell'altro.


Aggiunta di forze di fuga

Dopo che la forza dello sterzo è stata calcolata, deve essere aggiunta al vettore di velocità del personaggio. Poiché tale forza spinge il personaggio lontano dal bersaglio, ogni fotogramma del personaggio smetterà di muoversi verso il bersaglio e inizierà ad allontanarsi da esso, producendo un fuggire sentiero (la curva arancione nella figura seguente):

L'aggiunta di tali forze e il calcolo finale della velocità / posizione sono gestiti nello stesso modo di prima. Di seguito una demo che mostra diversi personaggi che eseguono il comportamento di fuga:


Muovi il mouse per muovere il bersaglio.

Ogni personaggio è posizionato al centro dell'area in movimento con una velocità casuale. Proveranno a fuggire dal bersaglio (il cursore del mouse). L'aggiunta di tutte le forze fa sì che ciascun personaggio abbandoni la rotta attuale e fugga dal bersaglio.

Attualmente l'obiettivo colpisce ogni personaggio, ignorando la distanza da loro; avrebbe potuto essere limitato a una "zona effetto", in cui il personaggio sarebbe fuggito solo se fosse abbastanza vicino all'obiettivo.


Arrivo

Il comportamento di ricerca, come abbiamo visto, fa muovere un personaggio verso un bersaglio. Quando raggiunge la destinazione, la forza di governo continua ad agire sulla base delle stesse regole, facendo in modo che il personaggio "rimbalzi" avanti e indietro intorno al bersaglio.


Il comportamento di ricerca. Muovi il mouse per muovere il bersaglio.

Il arrivo il comportamento impedisce al personaggio di muoversi attraverso il bersaglio. Rende il personaggio rallentare mentre si avvicina alla destinazione, fermandosi infine al bersaglio.

Il comportamento è composto da due fasi. La prima fase è quando il personaggio è lontano dal bersaglio e funziona esattamente allo stesso modo del comportamento di ricerca (si muove a tutta velocità verso il bersaglio).

La seconda fase è quando il personaggio è vicino al bersaglio, all'interno della "zona di rallentamento" (un cerchio centrato nella posizione del bersaglio):

Quando il personaggio entra nel cerchio, rallenta finché non si ferma sul bersaglio.


Rallentare

Quando il personaggio entra nell'area di rallentamento, la sua velocità viene ridotta linearmente a zero. Ciò è ottenuto aggiungendo una nuova forza di guida (il forza di arrivo) al vettore di velocità del personaggio. Il risultato di questa aggiunta alla fine diventerà zero, il che significa che nulla verrà aggiunto alla posizione del personaggio ogni fotogramma (quindi non ci sarà alcun movimento):

// Se (velocità + sterzo) è uguale a zero, allora non c'è velocità di movimento = troncata (velocità + sterzo, max_speed) posizione = posizione + velocità troncata (vettore: Vector3D, max: Numero): void var i: Number; i = max / vector.length; i = i < 1.0 ? i : 1.0; vector.scaleBy(i); 

Per garantire che il personaggio rallenti gradualmente prima che si fermi, la velocità non dovrebbe diventare zero immediatamente. Il processo di rallentamento graduale viene calcolato in base al raggio dell'area di rallentamento e alla distanza tra il personaggio e il target:

// Calcola la velocità desiderata desired_velocity = target - position distance = length (desired_velocity) // Controlla la distanza per rilevare se il carattere // si trova all'interno dell'area di rallentamento se (distanza < slowingRadius)  // Inside the slowing area desired_velocity = normalize(desired_velocity) * max_velocity * (distance / slowingRadius)  else  // Outside the slowing area. desired_velocity = normalize(desired_velocity) * max_velocity  // Set the steering based on this steering = desired_velocity - velocity

Se la distanza è maggiore di slowingRadius, significa che il personaggio è lontano dal bersaglio e la sua velocità dovrebbe rimanere max_velocity.

Se la distanza è inferiore a slowingRadius, significa che il personaggio è entrato nell'area di rallentamento e la sua velocità dovrebbe essere diminuita.

Il termine distanza / rallentamentoRadius varierà da 1 (quando distanza è uguale a slowingRadius) a 0 (quando distanza è quasi zero). Questa variazione lineare farà rallentare dolcemente la velocità:

Come precedentemente descritto, il movimento del personaggio viene eseguito come segue:

steering = desired_velocity - velocity velocity = truncate (velocità + sterzo, max_speed) posizione = posizione + velocità

Se la velocità desiderata viene ridotta a zero, allora la forza di sterzata diventa -velocità. Di conseguenza, quando quella forza di sterzata viene aggiunta alla velocità, risulterà zero, facendo smettere di muoversi il personaggio.

Di seguito una demo che mostra il comportamento di arrivo:


Muovi il mouse per muovere il bersaglio.

Ciò che il comportamento di arrivo fa, in realtà, è calcolare una forza che sarà uguale a -velocità, impedendo al personaggio di muoversi fintanto che questa forza è in atto. Il vettore di velocità originale del personaggio non cambia e continua a funzionare, ma viene annullato dall'aggiunta dello sterzo.

Se la forza di governo dell'arrivo viene sollevata, il personaggio inizierà a muoversi di nuovo, usando il suo vettore di velocità originale.


Conclusione

Il comportamento di fuga fa allontanare il personaggio dal bersaglio desiderato mentre il comportamento di arrivo lo rallenta e si ferma alla posizione del bersaglio. Entrambi possono essere utilizzati per creare una fuga uniforme o seguire schemi di movimento, ad esempio. Possono anche essere combinati per creare movimenti ancora più complessi.

Questo tutorial ha descritto più sui comportamenti di guida, spiegando i comportamenti di fuga e di arrivo. Nei prossimi post apprenderemo più comportamenti. Tieniti aggiornato seguendoci su Twitter, Facebook o Google+.