Missile guidé à temps constant

9

Je construis un jeu avec des joueurs et des missiles.

Je veux tirer un missile de P1 à P2. Le missile devrait toujours prendre exactement cinq secondes pour atteindre P2. Le missile devrait également suivre P2. Si P2 s'éloigne, le missile doit accélérer pour satisfaire la contrainte de synchronisation. Si P2 se déplace vers la gauche, le missile doit se déplacer vers la gauche (et changer également de vitesse). Si P2 se rapproche de P1, le missile doit ralentir.

Est-ce possible? Quelle est la meilleure façon d'y parvenir?

Je n'ai pas actuellement de classe Vector2D (ce n'est pas vraiment un jeu, mais l'analogie fonctionne bien), donc si possible, j'aimerais une solution qui n'en nécessite pas.

Edit: Ce n'est pas non plus un missile. :)

Merci!

Peter
la source
1
(J'ai un peu peur que quelqu'un pose des questions sur le guidage de missile qualifié par "ce n'est pas vraiment un jeu" mais…) Avez-vous des contraintes sur la forme de la trajectoire du missile? Peut-il toujours suivre une ligne droite entre sa position actuelle et le joueur 2? At-il une limite sur son rayon de braquage ou son accélération? Doit-elle éviter les obstacles? De plus, vous mentionnez Vector2D - est-il sûr de supposer que vous n'en avez besoin qu'en 2D? Vous pouvez faire toutes les mathématiques vectorielles par composant, mais il est maladroit d'écrire par rapport à une simple classe de mathématiques vectorielles, donc je ne comprends pas vraiment la préférence contre cela.
DMGregory
Vous avez manqué quelques informations supplémentaires. Y a-t-il des contraintes? Les missiles se déplacent-ils le long d'une ligne ou devons-nous nous soucier des directions et du nombre de dimensions éventuellement?
liggiorgio
Le chemin ne doit pas être contraint. Les seules règles sont les suivantes: A) Le "missile" doit toujours faire des pas vers sa cible. B) Le "missile" devrait toujours prendre 5 secondes pour y arriver. L'écriture d'une classe Vector2D n'est pas un problème. Je n'en ai pas un à portée de main (et les mathématiques ne sont pas mon meilleur sujet). Si cela facilite les choses, je peux l'ajouter.
Peter
La manière la plus simple de procéder consiste à utiliser une spline hermite et à mémoriser la valeur paramétrique.
Steven Srun

Réponses:

11

Le montage est rassurant. :)

D'accord, voici une boucle de mise à jour simple ...

En supposant que lorsque nous tirons le missile, nous initialisons remainingFlightTime = 5fpuis ...

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;
}
DMGregory
la source
1
Cette méthode ne fait pas tourner le "missile" autour de son point de lancement, à mi-vol. +1
Jon
0

Pourquoi ne pas conserver la position et mettre à jour la destination cible au fur et à mesure qu'elle change?

Vous pourriez avoir à regarder comment fonctionne lerping, mais cela ressemblerait à quelque chose comme ceci:

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);
}

en lerpant vous changez fondamentalement la position d'un objet sur une certaine période de temps afin que vous puissiez dire que vous êtes à 50% du chemin de A à B et que l'objet serait placé là. Lerping est direct donc vous vous dirigerez toujours vers la cible (comme vous le souhaitez dans les commentaires).

user3797758
la source
hein bien ma mauvaise ... je suppose que c'est ce qui se passe si vous essayez de coder à 3h du matin. a changé la réponse pour corriger le bogue
user3797758