Como posso encontrar o ângulo de lançamento de um projétil?

9

Estou fazendo um jogo 2D em que unidades disparam flechas umas nas outras. Conheço a posição do atirador e do alvo e a velocidade inicial do projétil. Quero saber o ângulo que o projétil deve ter para pousar no alvo. O alvo pode estar em uma altura diferente da do atirador.

Para resumir, eu sei v0, R e ge preciso encontrar o ângulo (ou a altura?).

Li http://en.wikipedia.org/wiki/Projectile_motion , mas não consigo encontrar algo relacionado ao que eu preciso.

korn3l
fonte
Depende se você deseja manter uma curva balística realista ou se uma parábola é boa o suficiente.
AB.
Você quer incluir o vento? Ou qualquer outra aceleração horizontal? (Faz a matemática mais difícil, é claro)
Seth Battin
Quero alcançar um movimento realista de projétil e não há vento envolvido.
Korn3l

Respostas:

11

A fórmula para encontrar o ângulo é

Fórmula

onde v é a velocidade inicial de lançamento, g é a constante de gravidade, x e y são a distância e a altura do alvo.

As duas raízes desta equação oferecem dois ângulos possíveis. Se os resultados forem imaginários , sua velocidade inicial não será grande o suficiente para atingir o alvo (se você deseja calcular o ângulo de alcance lido isso ). Cabe a você qual ângulo está selecionado. Faria sentido escolher o caminho mais direto, ou seja, o ângulo menor.

Você pode ver um GIF dessa equação abaixo com diferentes valores-alvo e uma velocidade de inicialização constante.

Fórmula representada graficamente como GIF animado

Recursos deste artigo da Wikipedia

Stephen Tierney
fonte
Observe que, na maioria dos casos, existem duas soluções válidas. Supondo que não seja atingido nenhum arrasto ou alcance máximo semelhante quando o projétil é disparado em um ângulo de 45 graus. Se você subir mais alto ou mais baixo, reduzirá o alcance - assim, a menos que você precise de toda a sua arma, haverá uma solução mais alta e mais baixa.
Loren Pechtel
Você provavelmente pegaria o ângulo que tem o menor tempo de vôo, que geralmente é um ângulo menor (provavelmente sempre, mas estou me permitindo a possibilidade de estar errado graciosamente heh). É mais rápido atirar no chão na frente dos pés, mirando para baixo do que mirando em um ângulo muito íngreme.
Azaral
@StephenTierney Obrigado pela resposta. Era isso que eu estava procurando.
Korn3l
Encontrou uma solução muito mais simples para este problema, as informações de en.wikipedia.org/wiki/...
Stephen Tierney
2

No início deste ano, criei um simples shooter de cima para baixo. Eu usei o seguinte método:

Resposta anterior: /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;
    }
}

Ele calcula uma trajetória entre duas posições.

Deukalion
fonte