Cálculo de la velocidad mínima del proyectil necesaria para alcanzar el objetivo en arco parabólico

Respuestas:

15

La función de trayectoria parabólica se define como:

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • Valores conocidos

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
    
  • Valores desconocidos:

    Vo: Initial Velocity
  • Para calcular 'Vo', podemos dar valores a la función F:

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
    
  • Ahora puede obtener todos los valores para alcanzar el objetivo desde el origen dando valores a t en la ecuación F:

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      
    
Blau
fuente
gran respuesta. solo date cuenta de que g no está firmado. A medida que aumenta g, Voy también debería aumentar.
milkplus
¿Cómo se conoce t (tiempo necesario para impactar)?
Dewald Swanepoel
13

Recientemente tuve que resolver un problema similar, se me ocurrieron dos soluciones, basadas en la fórmula que encontré en la página de Wikipedia 'Dan the Man' ya mencionada: Trayectoria de un proyectil

En esta solución, realmente necesita el ángulo de lanzamiento fijo o la velocidad x. La velocidad Y no es necesaria cuando lanzamos el proyectil en un ángulo específico.

Solución 1, el ángulo de lanzamiento es fijo, calcule la velocidad:

g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity

Solución 2, la velocidad es fija, calcule el ángulo de lanzamiento:

g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle

En mi caso, estas soluciones funcionaron bastante bien.

jonas
fuente
2

Si no le importa si es matemáticamente correcto, solo que se ve lo suficientemente correcto, calcule el camino recto y haga que su proyectil siga ese camino, pero "empújelo" a lo largo de la línea normal en función de su distancia hacia abajo el segmento de línea, por lo que sube a medida que se acerca a la mitad del segmento y cae a medida que se aleja de la mitad del segmento de línea.

Puede usar una onda sinusoidal para esto, usando el rango de grados de -90 a +90 (donde -90 es el punto izquierdo en el segmento de línea, 90 es el punto correcto y usted se mueve en el medio), y multiplique el resultado por una constante para escalarlo.

Si necesita la respuesta matemática / física puramente correcta, esto no ayudará. ¡Si no lo hace, esto probablemente puede funcionar bastante bien para usted!

No olvides que la programación del juego se trata de usar ilusiones que parecen correctas (y son más baratas de calcular), en lugar de realismo.

Atrix256
fuente
77
Re: "usar ilusiones que parecen correctas (y son más baratas de calcular)", estoy de acuerdo en general, pero en este caso parece un poco tonto dado lo fácil y barato que es usar el arco parabólico matemáticamente correcto.
Nathan Reed
1
Es cierto que esto parece una simplificación innecesaria, pero no creo que esta respuesta sea mala en el mal sentido, y no merece el voto negativo (incluso si no merece muchos votos positivos).
Will
En realidad, si vas a usar una onda sinusoidal, debería ser de 0 a 180 (o de 0 a pi en radianes)
Daniel Kaplan
2

Si solo necesita algo que sea correcto y tenga una velocidad fija, puede usar este método muy simplificado.

distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;

La distancia puede ser negativa, pero seguirá funcionando porque el ángulo también depende de la distancia. Si la distancia es negativa, el ángulo que debe agregarse también es negativo.

Tendrá que jugar con distanceFactor para encontrar el valor correcto. Depende de la gravedad y el poder del proyectil. Debe estar cerca de 1 dividido entre la distancia máxima que puede cubrir el proyectil.

API-Bestia
fuente
1
Aviso. Cuando probé tu código, tenías cos y pecado al revés. He editado su código para que sea correcto.
MrValdez