Come posso trovare l'angolo di lancio di un proiettile?


9

Sto realizzando un gioco 2d in cui le unità sparano frecce l'una contro l'altra. Conosco la posizione del tiratore e del bersaglio e la velocità iniziale del proiettile. Voglio sapere l'angolazione che il proiettile dovrebbe avere per atterrare sul bersaglio. Il bersaglio potrebbe essere ad un'altezza diversa rispetto al tiratore.

Per riassumere, conosco v0, R e ge ho bisogno di trovare l'angolo (o l'altezza?).

Ho letto http://en.wikipedia.org/wiki/Projectile_motion , ma non riesco a trovare qualcosa correlato a ciò di cui ho bisogno.


Dipende se si desidera attenersi a una curva balistica realistica o una parabola è abbastanza buona.
AB.

Vuoi includere il vento? O qualsiasi altra accelerazione orizzontale? (Rende la matematica più difficile, ovviamente)
Seth Battin


Voglio ottenere un movimento proiettile realistico e non c'è vento.
korn3l

Risposte:


11

La formula per trovare l'angolo è

Formula

dove v è la velocità iniziale di lancio, g è la costante di gravità, xey sono la distanza e l'altezza del bersaglio.

Le due radici di questa equazione ti danno due possibili angoli. Se i risultati sono immaginari, la tua velocità iniziale non è abbastanza grande da raggiungere l'obiettivo (se vuoi calcolare l'angolo di copertura, leggi questo ). Dipende da te quale angolo è selezionato. Avrebbe senso scegliere il percorso più diretto, ovvero l'angolo più piccolo.

Puoi vedere una GIF di questa equazione di seguito con diversi valori target e una velocità di lancio costante.

Formula rappresentata come GIF animata

Risorse da questo articolo di Wikipedia


Si noti che nella maggior parte dei casi esistono due soluzioni valide. Supponendo che non venga raggiunta alcuna resistenza o portata simile quando il proiettile viene sparato con un angolo di 45 gradi. Andare più in alto O più in basso abbasserà il raggio di azione - quindi a meno che tu non abbia bisogno di un po 'di grinta dalla tua pistola ci sarà una soluzione sia superiore che inferiore.
Loren Pechtel,

Probabilmente prenderesti l'angolo che ha il tempo di volo più breve, che di solito è un angolo più piccolo (probabilmente sempre ma mi sto concedendo la possibilità di sbagliarmi con grazia, eh). È più veloce sparare al suolo di fronte ai tuoi piedi mirando in basso piuttosto che in alto.
Azaral,

@StephenTierney Grazie per la risposta. Questo è quello che stavo cercando.
korn3l

Trovata una soluzione molto più semplice a questo problema, informazioni da en.wikipedia.org/wiki/…
Stephen Tierney

2

All'inizio di quest'anno ho creato un semplice sparatutto top down. Ho usato il seguente metodo:

Risposta precedente: /programming/15364852/move-sprite-diagonally/15365570#15365570

public static class Helper_Direction
{

    // Rotates one object to face another object (or position)
    public static double FaceObject(Vector2 position, Vector2 target)
    {
        return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
    }

    // Creates a Vector2 to use when moving object from position to a target, with a given speed
    public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
    {
        double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);

        Vector2 move = new Vector2(0, 0);

        move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
        move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;

        return move;
    }
}

Calcola una traiettoria tra due posizioni.

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.