import sys, time, math from pyglet.gl import * from euclid import * window = pyglet.window.Window(512,512) quadric = gluNewQuadric() GRAV_CONSTANT = 1 class Planet: def __init__(self, pos=Vector3(0,0,0), vel=Vector3(0,0,0), mass=1.0, color=[1,1,1]): self.pos = pos self.vel = vel self.mass = mass self.color = color def draw(self): glColor3f(self.color[0], self.color[1], self.color[2]) glPushMatrix() glTranslatef(self.pos[0], self.pos[1], self.pos[2]) gluDisk(quadric, 0, 1.0, 16, 1) glPopMatrix() def update(self, dt, planets): force = Vector3(0, 0, 0) for p in planets: if p != self: d = p.pos - self.pos f = GRAV_CONSTANT * self.mass * p.mass / d.magnitude_squared() dir = d.normalized() force += dir * f acc = force / self.mass self.vel += acc * dt self.pos += self.vel * dt planets = [] planets.append(Planet(mass=10000, color=[1,1,0])) planets.append(Planet(pos=Vector3(10,0,0), vel=Vector3(0,28,0), mass=100.0, color=[0,1,0])) planets.append(Planet(pos=Vector3(-14,0,0), vel=Vector3(0,-24,0), mass=50.0, color=[0,1,1])) planets.append(Planet(pos=Vector3(0,-16,0), vel=Vector3(-30,0,0), mass=2.0, color=[1,1,1])) @window.event def on_draw(): glClear(GL_COLOR_BUFFER_BIT) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(-25,25, -25,25, -25,25) glMatrixMode(GL_MODELVIEW) for p in planets: p.draw() def update(dt): for p in planets: p.update(dt, planets) pyglet.clock.schedule_interval(update,1/60.0) pyglet.app.run()