Missile guidato con tempo costante


9

Sto costruendo un gioco con giocatori e missili.

Voglio sparare un missile da P1 a P2. Il missile dovrebbe sempre impiegare esattamente cinque secondi per raggiungere P2. Il missile dovrebbe anche tracciare P2. Se P2 si allontana ulteriormente, il missile deve accelerare per soddisfare il vincolo di temporizzazione. Se P2 si sposta a sinistra, il missile deve spostarsi a sinistra (e cambiare anche la velocità). Se P2 si avvicina a P1, il missile deve rallentare.

È possibile? Qual è il modo migliore per raggiungere questo obiettivo?

Al momento non ho una classe Vector2D (questo non è in realtà un gioco, ma l'analogia funziona bene), quindi se possibile, mi piacerebbe una soluzione che non ne richieda una.

Modifica: neanche questo è un missile. :)

Grazie!


1
(Ho un po 'paura di qualcuno che chiede informazioni sulla guida missilistica qualificata da "questo non è in realtà un gioco" ma ...) Hai qualche vincolo sulla forma della traiettoria del missile? Può sempre seguire una linea retta tra la sua posizione attuale e il giocatore 2? Ha qualche limite al raggio di sterzata o all'accelerazione? Deve evitare gli ostacoli? Inoltre, menzioni Vector2D: è sicuro supporre che tu ne abbia bisogno solo in 2D? Puoi fare tutto il calcolo matematico vettoriale in modo componente, ma è ingombrante scrivere rispetto a una semplice classe matematica vettoriale, quindi non capisco davvero la preferenza rispetto a questo.
DMGregory

Hai perso alcune informazioni aggiuntive. Ci sono vincoli? I missili si muovono lungo una linea o dovremmo preoccuparci delle direzioni e di quante dimensioni alla fine?
liggiorgio,

Il percorso non deve essere limitato. Le uniche regole sono: A) Il "missile" dovrebbe sempre compiere passi verso il suo obiettivo. B) Il "missile" dovrebbe sempre impiegare 5 secondi per arrivarci. Scrivere una classe Vector2D non è un problema. Semplicemente non ne ho una a portata di mano (e la matematica non è la mia materia migliore). Se lo rende più semplice, posso aggiungerlo.
Peter,

Il modo più semplice per farlo è utilizzare una spline di eremita e immettere il valore parametrico.
Steven Srun,

Risposte:


11

La modifica è rassicurante. :)

Ok, ecco un semplice ciclo di aggiornamento ...

Supponendo che quando lanciamo il missile inizializziamo remainingFlightTime = 5fquindi ...

void UpdateMissile(float deltaTime)
{
   remainingFlightTime -= deltaTime;

   // At the end of the trajectory, snap to target & explode.
   // The math will put us there anyway, but this saves
   // on fancy logic related to overshooting. ;)
   if(remainingFlightTime <= 0f)
   {
      myX = targetX;
      myY = targetY;
      MissileImpact();
      return;
   }

   // Compute straight-line velocity that will take us
   // to the target in exactly the time remaining.
   velocityX = (targetX - myX)/remainingFlightTime;
   velocityY = (targetY - myY)/remainingFlightTime;

   // Integrate the velocity into the position.
   myX += velocityX * deltaTime;
   myY += velocityY * deltaTime;
}

1
Questo metodo non fa ruotare il "missile" attorno al suo punto di lancio, durante il volo. +1
Jon

0

Perché non modificare la posizione e aggiornare la destinazione target mentre cambia?

Potresti dover guardare come funziona il lerping ma sarebbe simile a questo:

public position startMarker;
public float duration = 5.0f;
private float startTime;
void Launch() {
    startTime = Time.time;
}
void Update() {
    float distCovered = (Time.time - startTime) / duration;
    missile.position = Vector3.Lerp(startMarker.position, target.position, distCovered);
}

lerpando stai sostanzialmente cambiando la posizione di un oggetto per un certo periodo di tempo in modo da poter dire che sei il 50% della strada da A a B e l'oggetto verrebbe posizionato lì. Lerping è diretto, quindi ti sposterai sempre verso l'obiettivo (come vuoi nei commenti).


eh bene mio male ... immagino sia quello che succede se provi a scrivere codice alle 3 del mattino. ha cambiato la risposta per correggere il bug
user3797758
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.