I am doing a gravitational simulation of n-bodies where there is an attractor point at (0, 0, 0). But the orbits of rigid bodies change a lot for each period. What am I doing wrong? Is it a problem of the simpleUpdate? Or in the calculation of the distance to the attractor point?

@Override
public void simpleUpdate(float tpf) {
for (PhysicsRigidBody rbc : bulletAppState.getPhysicsSpace().getRigidBodyList()) {
rbc.applyCentralForce(rbc.getPhysicsLocation().mult(-50f / rbc.getPhysicsLocation().distanceSquared(ZERO)));
}
}

JME physics uses single-precision (32-bit) floating point arithmetic. For astronomical simulations, youâ€™d probably need double precision (64-bit). Bullet Physics has double-precision capability, but accessing it from JME would require massive changes.

In the mean time, you could try a smaller physics timestep. The default timestep is 1/60 second, and you can alter it by invoking PhysicsSpace.setAccuracy(timeStep). However, since JME physics runs in real time, youâ€™ll encounter performance issues if you make the timestep too small.

Are you actually using bulletâ€™s collision detection? If not then itâ€™s a waste to use it at all. The â€śphysicsâ€ť part of a physics engine is dead-simple.

v = v + a * t
p = p + v * t

Apply forces as neededâ€¦ which isnâ€™t that much harder.

Edit: (and then you could pretty easily use double precision.)

Thank you very much for the advice, I have already tried calling PhysicsSpace.setAccuracy (timeStep) but the bodies follow exactly the same path if timeStep is worth 1/60, 1/60000 or 0.2. I am a beginner and I would like to study where the error comes from. Interestingly, if I replace what is inside mult (â€¦) by -5f it works very well and the orbit is stable, so I suspect that the error may come from the calculation of the distance.

Thank you very much, but I would like to have the things that jBullet has like collisions between the surfaces of the bodies. I am a beginner and I would die to know why the orbits unexpectedly change and I am disappointed not to know the cause. I have noticed that if I replace what is inside mult (â€¦) by -5f (always having an attractive force to the ZERO vector, but that remains constant with the distance) the orbits are perfect and do not alter with time . Thatâ€™s why I suspect that the problem is in the calculation of distance.

I notice youâ€™re using a 1/x law for the central force instead of an inverse-square law. Also, physics forces should be applied before each timestep, not during the frame update.

Because you have the distance in the numerator, you are computing a force proportional to distance/(distance squared) which is 1/distance, not 1/(distance squared).

To apply forces before every physics step, either add a PhysicsTickListener to your PhysicsSpace or else override the prePhysicsTick method of your BulletAppState.