Gravity in Space

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
Rakuen
Prole
Posts: 3
Joined: Wed Feb 09, 2011 6:18 pm

Gravity in Space

Post by Rakuen »

Hello everyone. I'm going to be working on a group project for school pretty soon. Someone mentioned using Lua for it, so I went looking for game libraries and found this one. I've got a decent understanding of things, but I've got a question about making multiple gravitational bodies.

Say I've got a ship flying around in space, and there are two planets in this space. What would I do to make both of these planets exert gravity on the ship from all sides? My gut says to make multiple Worlds, but I'm not sure if that's possible.

Thanks!
User avatar
TechnoCat
Inner party member
Posts: 1611
Joined: Thu Jul 30, 2009 12:31 am
Location: Denver, CO
Contact:

Re: Gravity in Space

Post by TechnoCat »

yay psuedo code

Code: Select all

for each ship
  gravity <- vector (0,0)
  for each planet
    gravity <- gravity + planetGravity(ship)
Then take the gravity and use http://love2d.org/wiki/Body:applyForce if you are using box2d.
Rakuen
Prole
Posts: 3
Joined: Wed Feb 09, 2011 6:18 pm

Re: Gravity in Space

Post by Rakuen »

So I would need to create a custom gravity function for the planets to use? I don't think that's a problem, I just want to make sure I understand.
User avatar
Robin
The Omniscient
Posts: 6506
Joined: Fri Feb 20, 2009 4:29 pm
Location: The Netherlands
Contact:

Re: Gravity in Space

Post by Robin »

Hi!
Rakuen wrote:My gut says to make multiple Worlds, but I'm not sure if that's possible.
No.

If multiple objects exert gravity on something, the acceleration vectors of both of them are added, e.g. a pull to the right with 2 m/s² and another pull to the right with 2 m/s² add up to 4 m/s². And a pull to the right with 2 m/s² and a pull to the left with 2 m/s² add up to 0 m/s², so no acceleration. If your velocity is also 0, that means you'll stay where you are. There are zones in actual outer space where this is the case (cue someone linking the Wikipedia article, I couldn't find it).

But if you use Box2D (i.e. love.physics), that happens automatically. If you write your own physics simulation, you'll have to add vectors anyway.

You need to calculate the gravity for each planet yourself anyway, since Box2D itself uses only simple gravity (i.e. in a direction, not to one or multiple points in space).
Help us help you: attach a .love.
Rakuen
Prole
Posts: 3
Joined: Wed Feb 09, 2011 6:18 pm

Re: Gravity in Space

Post by Rakuen »

Alright, thank you very much! :ultraglee:
User avatar
BlackBulletIV
Inner party member
Posts: 1261
Joined: Wed Dec 29, 2010 8:19 pm
Location: Queensland, Australia
Contact:

Re: Gravity in Space

Post by BlackBulletIV »

Here's a little function (untested - however I pulled it out of my GravityWell class which is tested) that makes a gravity well at a certain point and calculates how much force should be added to a physics body (I shared this in the General/Share Your Utils thread):

Code: Select all

--[[
    body is a physics body.
    x/y is the position of the well.
    power is the power you want applied. Something in the hundreds is good.
    epsilon is the minimum distance for which gravity is calculated. 
        Particles closer than this distance experience a gravity force as if 
        they were this distance away. This stops the gravity effect blowing 
   up as distances get small. 
--]]
function gravityWell(body, x, y, power, epsilon)
    local lx = x - body:getX()
    local ly = y - body:getY()
    local ldSq = lx * lx + ly * ly
    power = power * 10000 or 100000
    epsilon = epsilon * epsilon or 50 * 50

    if ldSq ~= 0 then
        local ld = math.sqrt(ldSq)
        if ldSq < epsilon then ldSq = epsilon end
        
        local lfactor = (power * love.timer.getDelta()) / (ldSq * ld)
        local oldX, oldY = body:getLinearVelocity()
        body:setLinearVelocity(oldX + lx * lfactor, oldY + ly * lfactor)
    end
end
However, you'll probably want to wrap that in a class. If you want an idea of how I've done it (although it's integrated into my framework Grace), and want to see a demo, take a look at this thread: http://love2d.org/forums/viewtopic.php?f=5&t=2422.
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot], Google [Bot] and 1 guest