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
- Vector velocidad
con
con
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 vpython 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=vs.vector(x_final/2., -1, 0),
size=vs.vector(x_final, 1, 10),
color=vs.color.green
)
# Creamos el 'cañón'
canyon = vs.cylinder(
pos=vs.vector(0, 0, 0),
axis=vs.vector(
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=vs.vector(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=vs.vector(0, 0, 0),
axis=vs.vector(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 = vs.vector(
v0x * t,
v0z * t - 0.5 * g * t**2,
0
)
flecha.pos = vs.vector(
v0x * t,
v0z * t - 0.5 * g * t**2,
0
)
flecha.axis = vs.vector(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:
- Primero definimos la velocidad inicial del proyectil y el ángulo con que sale disparado (podéis tocar estos valores para jugar y experimentar)
- Calculamos los resultados para definir un poco el escenario que vamos a dibujar
- En visual python definimos una caja (que asimilamos a la tierra plana en la que aún creen algunos :-()
- En visual python definimos el cañón (un simple cilindro)
- En visual python definimos el proyectil y su estela (una esfera)
- En visual python colocamos unas etiquetas que informarán de la posición del proyectil durante todo el movimiento
- 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.
Pybonacci