2012-09-11 15 views
8

Recientemente comencé a usar el motor jMonkey, lo cual es muy bueno. Pero me atasqué tratando de implementar la gravedad relativa.Gravedad relativa

Quiero hacer que los planetas orbitan uno alrededor del otro (no necesariamente en una órbita perfectamente circular, depende de la velocidad). Entonces, cada objeto debería afectar a otros objetos.

Lo que tengo en este momento:

apagar la gravedad mundial

bulletAppState.getPhysicsSpace().setGravity(Vector3f.ZERO); 

inicializar esferas y añadiendo al espacio física

Sphere sphere = new Sphere(50, 50, 5); 
Geometry sun = new Geometry("Sun", sphere); 

sun.setMaterial(stone_mat); 
rootNode.attachChild(sun); 
sun.setLocalTranslation(0, 0, 0); 

sunPhysics = new RigidBodyControl((float) (50*Math.pow(10, 5))); 
sun.addControl(sunPhysics); 
bulletAppState.getPhysicsSpace().add(sunPhysics); 

Geometry mercury = new Geometry("Mercury", sphere); 

mercury.setMaterial(stone_mat); 
rootNode.attachChild(mercury); 
mercury.setLocalTranslation(15f, 0, 0); 

mercuryPhysics = new RigidBodyControl((float) (5)); 
mercury.addControl(mercuryPhysics); 
bulletAppState.getPhysicsSpace().add(mercuryPhysics); 

he notado que hay un método setGravity en la clase RigidBodyControl, pero solo establece la dirección. Entonces el objeto sigue así hasta que desaparece.

Tengo muchas ganas de encontrar respuestas.

Respuesta

1

Gravity in bulletphysics es una dirección para todos los objetos.

Debe establecer la gravedad a 0, como lo hizo y aplicar la fuerza también todos los objetos después de cada paso de simulación utilizando siguiente fórmula

F = m * a 

F - force 
m - objects mass 
a - acceleration 

aceleración normal en la tierra se g == 9.8

En la aceleración espacio de mayo de cada dependen de distancia del planeta o planetas.

Si te gusta para simular juego como Angry Birds Space, entonces debería considerar leer el artículo acerca de la gravedad en ese juego http://www.wired.com/wiredscience/2012/03/the-gravitational-force-in-angry-birds-space/

+0

Puede aplicar la fuerza con el método applyCentralForce – Max

+0

Gracias, a pesar de que puede haber manera "más sencilla" para aplicar esa.Pero no hay problema, lo intentaré de la forma en que sugirió :) –

0

Si quieres sistema estable, no utilice la física simulada. (Pero si el sistema tiene suficientes cuerpos importantes, nadie sabe cómo debe comportarse, por lo que no importa).

Para cosas como el sistema solar, usaría el modo cinemático para planetas (muévelos tú mismo) y para barcos, asteroides, etc. usa fuerzas. (A menos que usted hace biliard en el sistema solar)

3

La ley de la gravitación dice F = G (m1 * m2)/r^2 donde m1 y m2 son las masas de los dos cuerpos, y r es la distancia. G es la constante gravitacional.

segundos ley de Newton dice F = m * a, por lo que si los ponemos juntos, el cuerpo con masa m1 experimentaría una aceleración de a = G * m2/r^2 de atracción gravitatoria del cuerpo con masa m2.

Ahora, lo que tendría que hacer es: en cada paso de la simulación, para cada cuerpo, sumar los a s para cada cuerpo y aplicar esa aceleración a la velocidad del cuerpo.

a(body1) = G * sum[ mass(body2)/dist(body1, body2)^2 , for each body2 ]