Em um jogo 2D, eu simplesmente quero desenhar a trajetória de uma flecha em voo. Com o código abaixo, a trajetória (a parábola) parece correta, mas o ângulo (ou rotação) ou a seta não.
float g = -9.8f;
float x = (launchVelocity * time);
float y = (launchVelocity * time) + (0.5f * g * (float)Math.Pow(time, 2));
float angle = (float)Math.Tanh(y / x);
o que estou perdendo? Obrigado.
projectile-physics
Martin
fonte
fonte
Respostas:
Arctanh
dá-lhe a tangente para a curva hiperbólica! Tanto quanto sei, sua parábola não é uma hipérbole.Mas temos boas notícias: encontrar a tangente para a sua parábola é mais fácil. A equação é
Onde está o seu
launchVelocity
. Agora, a inclinação da sua flecha é:Você pode usar com segurança
Arctan
agora, se quiser.Algumas informações adicionais sobre física:
A trajetória aproximada que você está simulando se aplica ao centro de massa da sua flecha. Quando você diz "posição" (x, y), está falando sobre a posição do centro de massa. O centro de massa de uma flecha está levemente à frente a partir do ponto médio, e você deve levar isso em consideração se quiser desenhar a flecha.
Lembre-se de que você não está considerando o momento inercial da flecha (que pode variar muito se estiver atirando em uma balista gigante) e não está considerando a dinâmica de fluidos da flecha: o vôo da flecha não seguirá um caminho parabólico!
fonte
Você deseja o ângulo da seta a qualquer momento. Você lembrou que, para calcular um ângulo, há uma tangente. Mas aqui é onde seu pensamento começou a dar errado:
Ok, então se você negligenciar a fricção do ar, a velocidade x da seta é uma constante.
Primeiro, decomponha a velocidade nos componentes x e y. Você pode fotografar em um ângulo de 45 graus ou 60 graus. Então você precisa do launchVelocity e de um ângulo, não é um escalar.
Segundo, calcule tudo como duplo, e não flutuante. Você não é numericamente sofisticado o suficiente para saber quando o erro de arredondamento não o mata, portanto, não tente. De qualquer forma, não economiza muito tempo.
Terceiro, não use Math.pow, é lento e não é tão preciso quanto multiplicar por potências inteiras. Além disso, você pode economizar muito tempo usando o formulário de Horner (veja abaixo)
Se você está desesperado por desempenho, pode até precompor 0,5 * g, mas o código acima o levará 90% do caminho sem fazer nada muito louco. Faça benchmark fazendo isso 10 milhões de vezes, se desejar, não é uma quantidade enorme de tempo, mas em termos percentuais é bastante grande - as bibliotecas são muito lentas em Java
Então, se você queria o ângulo em que a flecha deveria ir, o que você quer é
E, neste caso, isso funcionaria porque dx é uma constante. Mas, em geral, dx pode ser zero, então você geralmente deseja usar:
que é uma função projetada especificamente para este trabalho.
Mas, como eu disse, as funções de biblioteca em Java são terrivelmente lentas e, nesse caso, há uma maneira melhor de fazê-lo sem o mencionado @FxIII acima.
Se a velocidade horizontal for sempre v0x e a velocidade vertical for:
então seu delta é: vx, vy
Você não precisa do ângulo. Se você quiser desenhar uma flecha, use algo nominalmente como:
plot (x, y, x + vx, y + vy);
Não sei o que você está desenhando, portanto, se você precisar do ângulo para girá-lo (como se estivesse usando o JOGL), use o ângulo.
Não se esqueça de usar o opengl para transformar o ângulo novamente em graus, porque o ATAN2 retorna radianos:
fonte
Tanh () ( tangente hiperbólica ) assume um ângulo como parâmetro, mas você alimentou a proporção dos lados.
O que você realmente deseja é usar o arco tangente hiperbólico , que toma a proporção dos lados como parâmetro e retorna o ângulo. (Nomear isso pode ser "atanh", "atanh2", "arctanh" ou algo semelhante; parece variar muito entre diferentes bibliotecas de matemática)
fonte