1

Tutorial de gravedad planetaria con Blender Game Engine

¡Hola, gentes de Internet! Hoy os explicaré como programar un script con Blender Game Engine para simular la fuerza de atracción de un planeta esférico sobre otros cuerpos, y con un par de toques también servirá para simular órbitas planetarias.


Manzanas y Planetas: un poco de física

Bien, como no sé como vamos de física de la ESO, vamos a hacer un repaso de las fórmula de la atracción gravitatoria de Newton, ¿de acuerdo?

Como ya sabemos, la gravedad es la fuerza de atracción que sufren dos (o más) cuerpos por el simple hecho de tener masa. Es la fuerza más débil de las cuatro fuerzas fundamentales del Universo, pero gracias a ella tenemos estrellas, planetas, asteroides… ¡y manzanas!

¡Yum!

Supongamos que tenemos dos objetos y queremos calcular la fuerza de atracción que ejercerá el objeto 2 sobre el objeto 1. En el lenguaje matemático moderno, la Ley de la Gravitación Universal de Newton establece que:

Dónde:

  • F es la fuerza final (en Newtons) del objeto 2 sobre el objeto 1.
  • G es la Constante de Gravitación Universal, también conocida como Constante de Newton. Su valor es 6.674×10−11 N · (m/kg)2
  • m1 y m2 son las masas en Kilogramos de los dos cuerpos.
  • r es la distancia entre el centro de los dos objetos. Si r1 es la posición del objeto 1 y r2 es la posición del objeto 2, entonces r = r2 – r1.

Es evidente que la fuerza que ejerce el objeto 2 sobre el objeto 1 es igual a la que ejerce el objeto 1 sobre el objeto 2, pero en sentido inverso (porque se invierte el signo de r).

La fuerza de gravedad es muy débil, y disminuye rápidamente cuándo los cuerpos se alejan. Y es una suerte… ¿os imagináis ser atraídos por los objetos que tenemos por casa…? Los planetas, por otra parte, son objetos masivos y voluminosos. Es por esta razón que a pesar de que la fuerza de gravedad sea débil, la Tierra nos atrae y las cosas caen muy rápido. Hay una fórmula mucho más simple para calcular la fuerza de atracción si suponemos que nos movemos muy cerca de la superfície de la tierra:

Dónde g es -9.81 m/s^2, la constante de gravedad terrestre, y m la masa del objeto. Esta fórmula es una aproximación, y no es adecuada si nos alejamos mucho de la superfície de la Tierra. Pero para la mayoría de cálculos básicos es suficiente. ¿Pero de dónde sale?

Si volvemos a la fórmula de gravedad inicial:

Hemos supuesto que nos movemos por la superfície de la Tierra. Por lo tanto la distancia entre el centro de la Tierra y el centro del objeto es constante, y es el Radio de la Tierra: R = 6.371.000 metros.

La Masa de la tierra también es constante: M = 5,972×10²⁴ Kg.

Y también lo es la Constante de Gravitación Universal, que ya hemos visto que es G = 6.674×10−11 N · (m/kg)2

Por tanto, podemos sustituir la fórmula inicial con estos parámetros y se simplifica fácilmente, obteniendo la fórmula de gravedad en la superfície terrestre:

Para nuestro ejemplo, supondremos que sólo el planeta ejerce una fuerza de atracción gravitatoria. El resto de objetos de la escena los ignoraremos y no atraerán a otros objetos hacia ellos.


Extensión al espacio 3D

Estas fórmulas sólo tienen en cuenta la atracción a lo largo de un eje, en un espacio unidimensional. ¿Cómo podemos extender estas fórmulas para que funcionen en el espacio 3D?

Basta con tener en cuenta que ahora r será el módulo de la distancia entre los dos objetos, y también hay que multiplicar la fórmula por el vector unitario para tener la fuerza en los tres ejes:

Dónde:

Teniendo en cuenta que ahora r1 y r2 son vectores tridimensionales, no escalares.

En consecuencia, la fórmula de gravedad simplificada será:


Preparación de la escena

La escena será muy básica: añadimos una esfera con Ctrl+A->Mesh-> UV Sphere. Esto será nuestro planeta, así que pulsando la tecla S lo escalaremos un poco para hacerlo mayor.

Después añadiremos otras UV Spheres más pequeñitas que serán los objetos que atraerá el planeta. Podemos añadir tres o cuatro, y disponerlas alrededor del planeta.

Todas estas esferas deben ser objetos Dinámicos, o no podremos aplicarles ninguna fuerza. Cambiamos el motor de Blender Render a Blender Game:

Seleccionamos cada una de las mini-esferas y cambiamos su Physics Type de Static a Dynamic:

Por último, como queremos que la gravedad se calcule con nuestro script, eliminamos la gravedad que calcula por defecto el Blender Game Engine.


Script de gravedad terrestre

En este primer script simularemos la gravedad en la superfície de la Tierra. Con pocas variables, da unos resultados bastante chulos. Escribimos este script en el Text Editor y lo guardamos con el nombre gravity.py

# SCRIPT DE GRAVEDAD TERRESTRE
#
# Simula la gravedad a la superfície de la Tierre
#
# Escrito por Nano en beneficio de los seres humanos 🙂
# www.robologs.net

import bge

#La constante de gravedad de nuestro planeta (en la tierra, -9.81 m/s2)
g = 9.81

#Guardamos la escena para poder acceder a sus objetos
escena = bge.logic.getCurrentScene()

#Guardamos el planeta
planeta = escena.objects['planeta']

#Guardamos el objeto al que hemos cargado el script
obj = bge.logic.getCurrentController().owner

#Guardamos las posiciones del planeta y el objeto
loc_obj = obj.worldPosition
loc_planeta = planeta.worldPosition


#Guardamos las variables de la formula de gravitacion
#Las habriamos podido calcular directamente en la formula
#y ahorrarnos este paso, pero asi queda mas claro
r = loc_planeta-loc_obj
m1 = obj.mass
r_unitario = r.normalized()

#Calcular la fuerza de gravedad
F = g*m1*r_unitario

#Aplicar esta fuerza al objeto
obj.applyForce(F)

Ahora, a cada objeto que queramos que sea atraído por el planeta le hacemos esta configuración de Logic Bricks:

¡Ojo! Fíjemonos que hay que activar botón Pulse Mode del sensor Always


Script de gravedad general

Este script utiliza la fórmula general de gravitación universal. En este script, a diferencia del anterior, necesitamos tener en cuenta la masa del planeta. Sólo podremos ver resultados si la masa de los objetos y del planeta son (muy) grandes.

La gracia de este script es que es útil para simular sistemas planetarios. En el espacio las distancias son muy grandes, por tanto he añadido una pequeña línea en el código que sirve para indicar cuantos metros representa 1 Unidad de Blender.

# SCRIPT DE GRAVEDAD USANDO LA FORMULA GENERAL DE GRAVITACION
#
# Escrito por Nano en beneficio de los seres humanos 🙂
# www.robologs.net

import bge

#La constante de gravedad universal
g = -6.674*(10**-11)

#El planeta es un objeto estatico, asi que no podemos
#establecerle la masa a traves del editor del Blender.
#Hay que hacerlo por codigo:
masa_planeta = 5*(10**24)

#Para este ejemplo, recomiendo poner masas elevadas tambien a los
#otros objetos


#Esta constante indica cuantos metros son 1 unidad de blender.
cnt = 1000**2 # 1 UB = 1000^2 metros

#Guardamos la escena para poder acceder a sus objetos
escena = bge.logic.getCurrentScene()

#Guardamos el planeta
planeta = escena.objects['planeta']

#Guardamos el objeto al que hemos cargado el script
obj = bge.logic.getCurrentController().owner

#Guardamos las posiciones del planeta y el objeto
loc_obj = obj.worldPosition*cnt
loc_planeta = planeta.worldPosition*cnt


#Guardamos las variables de la formula de gravitacion
#Las habriamos podido calcular directamente en la formula
#y ahorrarnos este paso, pero asi queda mas claro
r = loc_planeta-loc_obj
m1 = obj.mass
m2 = masa_planeta
r_unitario = r.normalized()
modulo_r = r.dot(r)


#Calcular la fuerza de gravedad, excepto si el denominador es cero
try:
    F = -g*((m1*m2)/modulo_r)*r_unitario
except ZeroDivisionError:
    F = [0,0,0]

obj.applyForce(F)

Ahora, al igual que con el otro script, a cada objeto que queramos que sea atraído por el planeta le hacemos esta configuración de Logic Bricks:

¡Ojo! Fíjemonos que hay que activar botón Pulse Mode del sensor Always


Simular un sistema planetario

En cualquiera de los dos scripts hay un experimento muy chulo que podemos probar. Podemos coger una de las esferas pequeñas y aplicarle una fuerza que sea perpendicular a la fuerza de atracción que ejerce el planeta:

Esta fuerza externa puede aplicarse con la siguiente configuración de Logic Bricks:

Si la fuerza es suficiente, ¡veremos que el objeto empieza a orbitar alrededor del planeta, trazando trayectorias elípticas, de acuerdo con las Leyes de Kepler! ¡Es fascinante!

 

N4n0

Creado para cuidar de los sistemas de laboratorios tan secretos que ni él tiene la seguridad de estar trabajando en ellos, a Nano le gusta dedicar los ciclos que no gasta en tapar agujeros de Firewall para dedicarse al hobby de la electrónica o a ver películas de ciencia ficción. Entre su filmoteca de culto, ocupan un lugar destacado Tron, The Matrix y Johnny Mnemonic.

1
Deja un comentario

avatar
1 Hilos iniciados
0 Respuestas a hilos
0 Followers
 
Most reacted comment
Hottest comment thread
1 Nº autores comentarios
Borja Autores de comentarios recientes
más nuevos primero más antiguos primero
Borja
Humano
Borja

Fantástico! Muchas gracias por el código, y por el blog.