Trovare la velocità corretta affinché l'AI giri per raggiungere l'obiettivo


10

Ho una nave che viaggia alla massima velocità maxSpeede può girare rotationSpeedgradi al secondo. La nave si muove sempre nella direzione in cui è rivolta, il che significa che più veloce è la nave, maggiore è il suo raggio di sterzata.

Conosco la mia posizione, la rotazione e la posizione del bersaglio.

Quello che vorrei capire è se un bersaglio si trova nel mio raggio di sterzata a questa velocità, o meglio, qual è la velocità massima a cui posso viaggiare per fare la svolta verso il bersaglio senza girarci attorno continuamente.

Esiste un modo (ish) efficace per farlo?

Ecco cosa sto pensando finora: perché so quanto sto viaggiando per passo e quanto sto ruotando per passo, posso capire dove sarò nei prossimi due frame. La mia posizione attuale è p1, la mia posizione successiva è p2 quindi p3. Posso prendere le bisettrici perpendicolari di (p1, p2) e (p2, p3). Il loro punto di intersezione mi darà il centro di un cerchio. Posso quindi verificare se l'obiettivo si trova in quel cerchio.

Non sono sicuro che funzionerà in 3D (non sono sicuro di come calcolare una sfera con i miei input). Anche questa soluzione non aiuta molto a trovare la giusta velocità alla quale viaggiare, dovrei provare alcune volte con velocità diverse per trovarne una ragionevole.

Qualcuno può fare luce su una soluzione migliore?

Risposte:


17

Esistono due modi in cui un'unità controllata dall'IA con una velocità di rotazione associata e una velocità di movimento regolabile può raggiungere un obiettivo.

Innanzitutto, consideriamo la sfida che ci viene presentata in modo da poterla comprendere meglio:

inserisci qui la descrizione dell'immagine

Se il giocatore si muove e ruota a velocità costante mentre cerca di raggiungere un obiettivo che si trova sul lato destro o sinistro, si muoverà in cerchio per sempre, senza mai affrontarlo. Le due aree che il giocatore cercherà sono contrassegnate in rosso sopra.

L'area circolare contrassegnata in rosso può essere calcolata in questo modo:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Ciò si traduce nella posizione e nel raggio dei cerchi rossi. Possiamo usarlo per determinare se un determinato obiettivo è fuori dalla portata dell'unità controllata dall'IA se continua a girare verso la direzione dell'obiettivo.

Per scoprire se un determinato oggetto si trova all'interno di uno dei cerchi, calcoliamo semplicemente la distanza dal centro dei cerchi:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Esistono due possibili soluzioni per questo:

1.

Costruisci un po 'di distanza fino a quando l'obiettivo non si trova fuori dall'area rossa circolare e poi gira in senso inverso. Questo è semplice, lascia che l'unità continui a muoversi fino a quando il controllo non restituisce che l'obiettivo non è all'interno di questo cerchio. Quindi puoi voltarti.

inserisci qui la descrizione dell'immagine

L'altra opzione richiede un po 'più di lavoro per calcolare:

Tracciamo una linea immaginaria tra l'unità AI e l'obiettivo. Usando l'angolo tra di loro:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Ora è necessario eseguire le seguenti operazioni per calcolare la velocità corretta:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

inserisci qui la descrizione dell'immagine

Per farlo funzionare nel caso 3d:

Trova il piano su cui risiedono i seguenti tre punti:

  1. Il punto obiettivo.
  2. La posizione dell'unità AI nel frame precedente.
  3. La posizione corrente dell'unità AI.

È possibile utilizzare quell'aereo per calcolare la velocità nel secondo modo. Hai solo bisogno di convertire i punti dai loro valori 3d ai valori 2d incorporati sul loro piano comune.

Potresti voler usare questo:

Come convertire un punto 3D su un piano in coordinate UV?


Perfetto! Esattamente la risposta che speravo! Grazie per le tue spiegazioni dettagliate, penso di essere in grado di estrapolarlo e usarlo in 3D.
weichsem,

@weichsem Ho aggiornato la risposta. L'idea che ho suggerito è quella di trovare una pianura 2D comune che condividono e usarla per calcolare la velocità corretta.
AturSams,
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.