Lanzando proyectiles (con ayuda de vpython)

La mayoría de vosotros habréis resuelto el típico problema del lanzamiento de un proyectil que describe una trayectoria parabólica. Las ecuaciones que describen el movimiento son:

  • Vector posición

\(x = v_{0x} t + x_0\)

\(y = -frac{1}{2} g t^{2} + v_{0y} t + y_0\)

  • Vector velocidad

\(v_x = v_{0x}\) con \(v_{0x} = v_0 cos alpha\)

\(v_y = -g t + v_{0y}\) con \(v_{0y} = v_0 sin alpha\)

Hoy vamos a intentar resolverlo de forma gráfica con la ayuda de python y vpython. La biblioteca vpython une python con una librería gráfica 3D de forma que, como vamos a ver, hacer animaciones 3D sencillas se convierte en un juego.

import visual as vs
import numpy as np
## valores iniciales (modifícalos bajo tu responsabilidad)
v0 = 20 ## v en m/s
alfa = 60 ## ángulo en grados
vel_fotogramas = 10  ## la velocidad del video
## Constantes
g = 9.81 ## Aceleración de la gravedad
## ecuaciones
v0x = v0 * np.cos(np.deg2rad(alfa))
v0z = v0 * np.sin(np.deg2rad(alfa))
t_total = 2 * v0z / g
x_final = v0x * t_total
## Empezamos con visual python (vpython)
## Creamos el 'suelo'
suelo = vs.box(pos = (x_final/2., -1, 0),
               size = (x_final, 1, 10), color = vs.color.green)
## Creamos el 'cañón'
canyon = vs.cylinder(pos = (0, 0, 0),
                     axis = (2 * np.cos(np.deg2rad(alfa)), 2 * np.sin(np.deg2rad(alfa)), 0))
## Creamos el proyectil y una línea que dejará la estela del proyectil
bola = vs.sphere(pos = (0, 0, 0))
bola.trail = vs.curve(color=bola.color)
## Creamos la flecha que indica la dirección del movimiento (vector velocidad)
flecha = vs.arrow(pos = (0, 0, 0),
                  axis = (v0x, v0z, 0), color = vs.color.yellow)
## texto (ponemos etiquetas para informar de la posición del proyectil)
labelx = vs.label(pos = bola.pos, text= 'posicion x = 0 m', xoffset=1,
                  yoffset=80, space=bola.radius, font='sans', box = False,
                  height = 10)
labely = vs.label(pos = bola.pos, text= 'posicion y = 0 m', xoffset=1,
                  yoffset=40, space=bola.radius, font='sans', box = False,
                  height = 10)
## Animamos todo el cotarro!!!
t = 0
while t <= t_total:
    bola.pos = (v0x * t, v0z * t - 0.5 * g * t**2, 0)
    flecha.pos = (v0x * t, v0z * t - 0.5 * g * t**2, 0)
    flecha.axis = (v0x, v0z - g * t, 0)
    bola.trail.append(pos=bola.pos)
    labelx.pos = bola.pos
    labelx.text = 'posicion x = %s m' % str(v0x * t)
    labely.pos = bola.pos
    labely.text = 'posicion y = %s m' % str(v0z * t - 0.5 * g * t**2)
    t = t + t_total / 100.
    vs.rate(vel_fotogramas)

Voy a explicar brevemente lo que hace el código:

  1. Primero definimos la velocidad inicial del proyectil y el ángulo con que sale disparado (podéis tocar estos valores para jugar y experimentar)
  2. Calculamos los resultados para definir un poco el escenario que vamos a dibujar
  3. En visual python definimos una caja (que asimilamos a la tierra plana en la que aún creen algunos :-()
  4. En visual python definimos el cañón (un simple cilindro)
  5. En visual python definimos el proyectil y su estela (una esfera)
  6. En visual python colocamos unas etiquetas que informarán de la posición del proyectil durante todo el movimiento
  7. Finalmente hacemos un bucle hasta llegar al t final (rate sirve para definir la velocidad de la animación)

El resultado que os debería salir debería ser algo parecido a lo que se puede ver en el siguiente vídeo.

Espero que os haya gustado. Si alguno se anima a hacer algún ejemplo (científico) similar nos encantaría que lo compartiera en los comentarios. Por otro lado, siempre estamos abiertos a críticas, sugerencias y colaboraciones.

Saludos.

[Edito] He cometido una errata, en la línea 54 ponía 'posición x' y debería poner 'posición y'. En el vídeo salen dos etiquetas x, la segunda corresponde a la y. En cuanto pueda vuelvo a hacer y a subir el vídeo. Disculpad las molestias.

Kiko Correoso

Licenciado y PhD en Ciencias Físicas, especializado en temas de física, meteorología, climatología, energías renovables, estadística, aprendizaje automático, análisis y visualización de datos. Apasionado de Python y su comunidad. Fundador de pybonacci y editor del sitio en el que se divulga Python, Ciencia y el conocimiento libre en español.

More Posts

Follow Me:
TwitterLinkedIn

10 thoughts on “Lanzando proyectiles (con ayuda de vpython)

  1. Pingback: Bitacoras.com
  2. Después de hacer esta entrada he visto que hay un vídeo en youtube que muestra algo parecido a la entrada (pero mejor) y que os recomiendo:

  3. me puedes ayudar para hacer lo mismo (que el usuario escriba la velocidad inicial y el angulo) pero no en visual, sino que en un grafico usado pyplot y esas cosas

  4. trayectoria parabólica que sigue un motociclista al saltar por una rampa. El reto consiste en diseñar un programa en Python que, conociendo la velocidad inicial con la que el motociclista sale de la rampa y el ángulo de inclinación de la misma, sea posible calcular: las componentes de la velocidad Vx y Vy, la posición en x y y en cada instante de tiempo t, la altura máxima alcanza por el motociclista Xmax y el tiempo total transcurrido desde que el motociclista sale de la rampa hasta que vuelva a caer en tierra Ttotal

  5. Hola amigo, soy nuevo en esto de los gráficos, tengo un problema: Cuando cambio los valos de velocidad inicial y ángulo por un float(input) me deja ingresarle los datos pero luego no se me abre la animación.
    Tengo que usar algún comando para que luego de que le ingrese los valores me mande a la gráfica de vpython?
    Gracias de antemano.

  6. Buenas, soy de Argentina y los felicito por la pagina. Queria preguntarles de que manera puedo instalar el vpython en el jupyter notebook , la verdad que estoy teniendo problemas, saludos!!!

    1. Hola.
      Es mejor que hagas este tipo de preguntas en es.stackoverflow.com. Allí te podremos ayudar nosotros y muchos otros a resolver el problema.

Leave a Reply to morbid_face Cancel reply