Echilon
- 3
- 0
I'm pulling my hair out with this problem. I have two bodies and I'm trying to calculate gravity between them. This is for a game, and there are actually three bodies currently, each frame, I check the distance each one moves due to gravity and store it in a cache (to simulate gravity acting on all objects simultaneously), then apply each vector to the body. This is the code I have:
The angles are off though, and I'm convinced it has something to do with the coordinate system Java uses for drawing but I can't get it to work properly. Is there anything obvious I've been overlooking?
Code:
public void calculateGravity(GravitationalBody planet) {
if(isFixed || gravityIndex.contains(planet.hashCode()) || planet.getGravityIndex().contains(this.hashCode())) {
return;
}
double radiusGravity = this.getCenter().distance(planet.getCenter());
double force = (Constants.G * this.mass * planet.mass)/(radiusGravity*radiusGravity); // F=GMm/r^2
double frameRateMs = (Constants.FrameRate/1000.0);
double gravityAngle = Math.atan2(Math.max(location.y,planet.location.y) - Math.min(location.y,planet.location.y),
Math.max(location.x,planet.location.x) - Math.min(location.x,planet.location.x)) + (Math.PI/2);
double gravityDistance = ((force*frameRateMs)/this.mass)*Constants.SpriteGravityMultiplier;
if(gravityAngle < 0){ // keep angle positive
gravityAngle += MaxAngle;
}
// System.out.println("--"+name+"<->"+planet.getName()+"-"+gravityDistance+"px @ "+Math.round(gravityAngle)+"rad");
if(planet.IsFixed()) { // gravity acts only on this body, pulling it towards the planet
gravityCache.add(new Vector2D(gravityAngle, gravityDistance));
gravityIndex.add(planet.hashCode());
} else { // gravity acts on both, pulling them toward each other
double resultantGravAngle = (gravityAngle/2),
resultantGravDistance = (gravityDistance /2);
gravityCache.add(new Vector2D(resultantGravAngle, resultantGravDistance));
gravityIndex.add(planet.hashCode());
planet.getGravityCache().add(new Vector2D(resultantGravAngle, resultantGravDistance));
planet.getGravityIndex().add(planet.hashCode());
}
}
Assuming Constants.Framerate = 30, Constants.G = 6.667, Constants.SpriteGravityMultiplier = 1e1