Search code examples
javajmonkeyenginebulletphysics

Relative gravity


I've started using jMonkey engine recently, which is very nice. But I got stuck trying to implement relative gravity.

I want to make planets orbiting around each other (not necessarily in perfectly circular orbit, depends on velocity). So every object should affect other objects.

What I have right now:

turning off global gravity

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

initializing spheres and adding to physics space

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);

I noticed that there is method setGravity in RigidBodyControl class, but it just sets the direction. So object goes that way until it disappears.

I am really looking forward for answers.


Solution

  • Gravity in bulletphysics is one direction for all objects.

    You should set gravity to 0 like you did and apply force too all objects after every simulation step using following formula

    F = m * a
    
    F - force
    m - objects mass
    a - acceleration 
    

    regular acceleration on earth is g == 9.8

    In space acceleration may every depend on distance from planet or planets.

    If you like to simulate game like Angry Birds Space then you should consider reading article about gravity in that game http://www.wired.com/wiredscience/2012/03/the-gravitational-force-in-angry-birds-space/