martes, 7 de febrero de 2012

Programando las leyes de Newton, versión fácil

Cogiendo un poco de aquí y de allí he creado dos esferas en Blender (editor 3D) y les he programado con Python un comportamiento regido por la ley de la gravitación universal de Newton. Igual suena complicado pero si miráis el código es muy básico y prácticamente es una aplicación directa de las fórmulas que vimos en Física en el instituto.

A lo mejor os parece raro que no haya algún While o similar. Lo que pasa es que en Blender van sucediéndose fotogramas (24 por segundo) y en cada fotograma se ejecuta el código, así que ya se va repitiendo.

from bge import logic, events
import math
def Player():
   cont = logic.getCurrentController()
   obj = cont.owner
   #Hasta aquí todo eran órdenes muy específicas de Blender, mejor ni mirarlas
   #Lo importante es que obj se refiere a la esfera pequena
   if not 'init' in obj: #Esto solo quiero que se ejecute una vez
       obj['init'] = 1
       #Aquí defino la velocidad inicial, solo la primera vez que se ejecute el código
       obj['vox']=0.05
       obj['voy']=0.06
   #Aquí defino la masa de ambos cuerpos, y la constante gravitacional
   m1=250000000
   m2=2000
   G=0.0000000000667
   #Obtengo la posición actual y calculo la distancia al origen de coordenadas (hipotenusa)
   x=obj.position[0]
   y=obj.position[1]
   r=math.hypot(x,y)
   #Utilizo la fórmula de la gravedad entre cuerpos
   F=G*m1*m2/(r*r)
   #A partir de la fuerza se obtiene la acelaración
   a=F/m2
   #Descompongo en componente x e y
   ax=-a*x/r
   ay=-a*y/r
   #Calculo la velocidad actual basándome en la velocidad anterior y en la aceleración
   vx=obj['vox']+ax
   vy=obj['voy']+ay
   #Obtengo la posición actual a partir de la anterior y la velocidad
   xf=x+vx
   yf=y+vy
   #Muevo el objeto esfera
   obj.position[0]=xf
   obj.position[1]=yf
   #Por último guardo la velocidad actual para que pase a ser "anterior"
   obj['vox']=vx
   obj['voy']=vy

El problema sería que si ponemos las variables demasiado realistas  tendríamos una esfera "Tierra" que tardaría un año en  darle la vuelta al sol, así que he tenido que cocinar un poco las masas y la velocidad inicial para que resulte una animación más rápida, aquí la tenéis:


Se puede configurar para que haga una órbita muy excéntrica, o lo que se quiera:






Si alguien quiere el archivo blender que lo diga.

3 comentarios:

Albert dijo...

Faltaría ver el eje de coordenadas pero a primera vista diría que la tierra está retrocediendo en el tiempo.

PPi dijo...

Muy observador coco, he estado pensando cómo debe ser el movimiento de traslación de la Tierra en función de cómo van apareciendo nuevas constelaciones por el Este a medida que avanza el año y ciertamente parece que el movimiento de traslación debería ser al revés, es decir antihorario... siempre que estemos mirando el sistema solar desde el polo norte del plano de la eclíptica. Miraré en la enciclopedia a ver.

PPi dijo...

Por otra parte se comprueba con el modelo que Bater ha puesto que la trayectoria seguida por un cuerpo bajo la influencia de un campo gravitatorio, no depende de su masa sino de su velocidad inicial. Así, existen los famosos troyanos, que son objetos de mucho menor masa que la Tierra y que comparten la órbita de ésta.