import sys, time, math from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from dmsgl import * camera = OrthoCamera(-25,25, -25,25, -25,25) light = Light() GRAV_CONSTANT = 1 class Planet: def __init__(self, pos=Vector([0,0,0]), vel=Vector([0,0,0]), mass=1.0, material=Material()): self.pos = pos self.vel = vel self.mass = mass self.material = material def draw(self): self.material.apply() glPushMatrix() glTranslatef(self.pos[0], self.pos[1], self.pos[2]) gluSphere(quadric, 1.0, 16, 8) glPopMatrix() self.material.disable() def update(self, dt, planets): force = Vector([0, 0, 0]) for p in planets: if p != self: f = GRAV_CONSTANT * self.mass * p.mass / self.pos.distanceSquared(p.pos) dir = p.pos - self.pos dir.normalize() force += dir * f acc = force / self.mass self.vel += acc * dt self.pos += self.vel * dt planets = [] planets.append(Planet(mass=10000, material=Material(diffuse=Color.Yellow))) planets.append(Planet(pos=Vector([10,0,0]), vel=Vector([0,28,0]), mass=100.0, material=Material(diffuse=Color.Green))) planets.append(Planet(pos=Vector([-14,0,0]), vel=Vector([0,-24,0]), mass=50.0, material=Material(diffuse=Color.Cyan))) planets.append(Planet(pos=Vector([0,-16,0]), vel=Vector([-30,0,0]), mass=2.0, material=Material(diffuse=Color.White))) active = False def draw(): Color.Black.clear() camera.apply() light.apply() for p in planets: p.draw() glutSwapBuffers() def keyboard(key, x, y): global active if key == chr(27): sys.exit(0) elif key == ' ': active = not active prevTime = time.time() def update(): global prevTime, active t = time.time() dt = t - prevTime prevTime = t if active: for p in planets: p.update(dt, planets) glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutIdleFunc(update) glEnable(GL_DEPTH_TEST) quadric = gluNewQuadric() glutMainLoop()