(another) planetary gravity question

Started by
6 comments, last by h4tt3n 12 years, 3 months ago
Hi, i've looked through a few topics on this but i can't find an answer. I understand - tentatively - how orbital gravity works, i've read and mostly understood the code examples given before. But what i don't understand is how an object such as a satelite when in orbit always retains its orientation relative to the object it is orbiting. Is this artificial or does it happen naturally? And if its natural how would this be incorporated in a script. I realise that i could reorientate based on previous position but if there is a physics explanation then i'd like to incorporate it.

adam
Advertisement
If you are talking about artificial satellites always facing Earth, that is because they had a little bit of rotation put in by maneuvering thrusters to do so. If you are talking about Earth's moon, then the reason for it always having the same side face Earth is because of tidal effects.
In general the orbit and the rotation of objects is independent of each other. The planets also rotate in their orbit around the sun... In case of satellites their orientation towards earth is intentional. Large enough bodies like the moon that are in relatively close orbit are a somewhat special case since tidal forces cause an energy transfer between rotation and orbital velocity. In the case of the Moon that lead to the moons rotation being coupled with it's orbit...
Ah ok, thanks. It was really wrecking my head trying to figure out where that rotation could come from.

adam
Right i've created a bit of code to create an orbiting planet. The values are just guess' at the minute, i'm not looking for accuracy yet.


import bpy
import mathutils
import math
for i in bpy.app.handlers.frame_change_pre:
bpy.app.handlers.frame_change_pre.remove(i)
star = bpy.data.objects['star']
planet = bpy.data.objects['planet']
planet.location = mathutils.Vector((0, 8, 0))
starMass = 40.0
planetMass = 1.0
G = math.pow(6.67300, 11)
def iterator(self):

r = (planet.location - star.location) * 100000

f = ((-G * (starMass * planetMass)) / math.pow(r.copy().magnitude, 2) * r.copy().normalized())

tangental_force = r.copy().normalized().cross(mathutils.Vector((0, 0, 1)))
print(tangental_force / 1000000)

planet.location += f
planet.location += tangental_force
#planet.location += r_cross

bpy.app.handlers.frame_change_pre.append(iterator)


I've given the object a force that is constantly tangential to the force of gravity but i don't think that's the correct way to do this. If an asteroid was moving through space it wouldn't be able to apply a force tangential to gravity because it would have nowhere to get this force. Am i right?

adam
You don't have to apply any force other than gravity. you just give the object an initial velocity and then energy conservation keeps it going (there is no atmosphere or friction to dissipate energy) and the gravitational force keeps it on its orbit.

But you need a correct integration scheme. location + force doesn't even make sense physically speaking.
The simplest way to do this is Euler integration:

v += dt*F/m
x += dt*v
Japro thanks for the help. I've implemented an integration method and it seems to be working well. I also wanted the objects to effect each other so i've added the equation f=ma.


import bpy
import mathutils
import math
import decimal
for i in bpy.app.handlers.frame_change_pre:
bpy.app.handlers.frame_change_pre.remove(i)
star = bpy.data.objects['star']
planet = bpy.data.objects['planet']
planet.location = mathutils.Vector((-8, 12, 0))
star.location = mathutils.Vector((0, 0, 0))
starMass = 600#3.42 * math.pow(10, 23)
planetMass = 1#2.03 * math.pow(10, 30)
dT = 1 / 24
G = -0.01#6.67300 * math.pow(10, -11)
planet_v = mathutils.Vector((0.8, -0.2, 0))
star_v = mathutils.Vector((0, 0 ,0))
def iterator(self):
frame = str(bpy.data.scenes['Scene'].frame_current) + ' '
global planet_v
global star_v

r = (planet.location - star.location)
planet_f = starMass * ((G * (starMass * planetMass)) / math.pow(r.copy().magnitude, 2)* r.copy().normalized())
star_f = planetMass * ((G * (starMass * planetMass)) / math.pow(r.copy().magnitude, 2)* r.copy().normalized())

planet_v += planet_f * math.pow(dT, 2)
star_v += star_f * math.pow(dT, 2)

planet.location += planet_v
star.location += star_v
bpy.app.handlers.frame_change_pre.append(iterator)


To get the f=ma equation to work i've had to use the mass of the other object. It looks right once i run the simulation but is it correct.

adam

gravity_force = ((G * (starMass * planetMass)) / math.pow(r.copy().magnitude, 2)* r.copy().normalized())
planet_v += ( gravity_force / planetMass) * dT
star_v += (-gravity_force / starMass ) * dT


this should work. If the planets repel each other, swap the minus sign.

This topic is closed to new replies.

Advertisement