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() alphablend = Transparency(blendSource=GL_SRC_ALPHA,blendDest=GL_ONE_MINUS_SRC_ALPHA) GravityAccel = Vector([0, -9.8, 0]) WaterDensity = 1 WaterDrag = 1 AirDrag = 0.1 class Object: def __init__(self, pos=Vector([0,0,0]), vel=Vector([0,0,0]), mass=1.0, radius=1.0, material=Material()): self.pos = pos self.vel = vel self.mass = mass self.radius = radius self.material = material def draw(self): self.material.apply() glPushMatrix() glTranslatef(self.pos[0], self.pos[1], self.pos[2]) gluSphere(quadric, self.radius, 16, 8) glPopMatrix() self.material.disable() def update(self, dt): force = Vector([0, 0, 0]) force += GravityAccel * self.mass if self.pos[1] < 0: volume = 4 * math.pi * self.radius * self.radius * self.radius / 3 force += -GravityAccel * WaterDensity * volume force += -self.vel * WaterDrag else: force += -self.vel * AirDrag acc = force / self.mass self.vel += acc * dt self.pos += self.vel * dt objects = [] objects.append(Object(pos=Vector([-4, 16, 0]), mass=1.0, radius=1.0, material=Material(diffuse=Color.Red))) objects.append(Object(pos=Vector([4, 16, 0]), mass=1.0, radius=3.0, material=Material(diffuse=Color.Green))) active = False def draw(): Color.Black.clear() camera.apply() light.apply() for o in objects: o.draw() alphablend.apply() glColor4f(0, 0, 1, 0.5) glBegin(GL_QUADS) glVertex3f(-25, -25, 10) glVertex3f(25, -25, 10) glVertex3f(25, 0, 10) glVertex3f(-25, 0, 10) glEnd() alphablend.disable() 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 o in objects: o.update(dt) 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()