En un juego 2D, simplemente quiero dibujar la trayectoria de una flecha en vuelo. Con el siguiente código, la trayectoria (la parábola) se ve bien, pero el ángulo (o rotación) o la flecha no.
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);
¿Qué me estoy perdiendo? Gracias.
projectile-physics
Martín
fuente
fuente
Respuestas:
Arctanh
te da la tangente para la curva hiperbólica! Que yo sepa, tu parábola no es una hipérbola.Pero tenemos buenas noticias: encontrar la tangente para su parábola es más fácil. La ecuación es
¿Dónde está tu
launchVelocity
? Ahora la pendiente de tu flecha es:Puede usarlo
Arctan
ahora con seguridad si lo deseaAlguna información adicional sobre física:
La trayectoria aproximada que está simulando se aplica al centro de masa de su flecha. Cuando dices "posición" (x, y) estás hablando de la posición del centro de masa. El centro de masa de una flecha está ligeramente hacia adelante desde el punto medio y debe tenerlo en cuenta si va a dibujar la flecha.
Tenga en cuenta que no está considerando el momento de inercia de la flecha (que puede variar mucho si dispara una ballesta gigante) y no está considerando la dinámica de fluidos de la flecha: ¡el vuelo de la flecha del arco no seguirá un camino parabólico!
fuente
Desea el ángulo de la flecha en cualquier momento. Recordaste que para calcular un ángulo, hay una tangente. Pero aquí es donde su pensamiento comenzó a salir mal:
Ok, entonces si descuidas la fricción del aire, entonces la velocidad x de la flecha es constante.
Primero, descomponga la velocidad en componentes x e y. Podría disparar en un ángulo de 45 grados o 60 grados. Por lo tanto, necesita launchVelocity y un ángulo, no es escalar.
Segundo, calcule todo como doble, no como flotante. No eres lo suficientemente sofisticado numéricamente para saber cuándo el error de redondeo no te matará, así que no lo intentes. No es un gran ahorro de tiempo en ningún caso.
Tercero, no use Math.pow, es lento y no es tan preciso como multiplicar por potencias enteras. También puede ahorrar mucho tiempo utilizando el formulario de Horner (ver más abajo)
Si está desesperado por el rendimiento, incluso puede calcular previamente 0.5 * g, pero el código anterior lo llevará al 90% del camino sin hacer nada demasiado loco. Benchmark haciendo esto 10 millones de veces si lo desea, ciertamente no es una gran cantidad de tiempo, pero en términos de porcentaje es bastante grande: las bibliotecas son muy lentas en Java
Entonces, si querías el ángulo en el que debe ir la flecha, lo que quieres es
Y en este caso, eso funcionaría porque dx es una constante. Pero en general, dx puede ser cero, por lo que generalmente desea usar:
que es una función específicamente diseñada para este trabajo.
Pero como dije, las funciones de la biblioteca en Java son horriblemente lentas, y en este caso hay una mejor manera de hacerlo sin lo mencionado anteriormente por @FxIII.
Si la velocidad horizontal es siempre v0x, y la velocidad vertical es:
entonces su delta es: vx, vy
No necesitas el ángulo. Si desea dibujar una flecha, use algo nominalmente como:
plot (x, y, x + vx, y + vy);
No sé qué estás dibujando, así que si necesitas el ángulo para rotarlo (como si estuvieras usando JOGL), entonces seguro, usa el ángulo.
No olvide si está usando opengl para volver a convertir el ángulo en grados, porque ATAN2 devuelve radianes:
fuente
Tanh () ( tangente hiperbólica ) toma un ángulo como parámetro, pero le has dado la relación de los lados.
Lo que realmente quieres es usar el arcotangente hiperbólico , que toma la relación de los lados como parámetro y devuelve el ángulo. (Nombrar esto puede ser "atanh", "atanh2", "arctanh" o algo similar; parece variar mucho entre las diferentes bibliotecas de matemáticas)
fuente