import sys, random, time, math from OpenGL.GLUT import * from OpenGL.GL import * from OpenGL.GLU import * import os startDir = os.getcwd() + os.sep class Triangle: color = [random.uniform(0,1), random.uniform(0,1), random.uniform(0,1)] def __init__(self, x, y): self.x = x self.y = y self.rgb = Triangle.color[:] Triangle.color[0] += random.uniform(-0.05, 0.05) Triangle.color[1] += random.uniform(-0.05, 0.05) Triangle.color[2] += random.uniform(-0.05, 0.05) self.angle = 0 def update(self, t, dt): self.angle += 360 * dt # self.rgb[0] *= 0.93 # self.rgb[1] *= 0.93 # self.rgb[2] *= 0.93 def draw(self): glColor3fv(self.rgb) glPushMatrix() glTranslatef(self.x, self.y, 0) glRotatef(self.angle, 0, 0, 1) glBegin(GL_TRIANGLES) glVertex2f(-0.1, -0.1) glVertex2f(0.1, -0.1) glVertex2f(0, 0.1) glEnd() glPopMatrix() objects = [] def draw(): glClearColor(0,0,0,0) glClear(GL_COLOR_BUFFER_BIT) for t in objects: t.draw() glutSwapBuffers() def keyboard(key, x, y): if key == chr(27): sys.exit(0) elif key == 'r': Triangle.color = [1,0,0] elif key == 'g': Triangle.color = [0,1,0] elif key == 'b': Triangle.color = [0,0,1] def mouseMotion(x,y): global pointer mx = (x / float(glutGet(GLUT_WINDOW_WIDTH))) * 2.0 - 1.0 my = 1.0 - (y / float(glutGet(GLUT_WINDOW_HEIGHT))) * 2.0 objects.append(Triangle(mx,my)) if len(objects) > 50: objects.remove(objects[0]) prevTime = -1 def update(v): global prevTime glutTimerFunc(16, update, 0) currentTime = time.time() if prevTime < 0: dt = 0 else: dt = currentTime - prevTime prevTime = currentTime for t in objects: t.update(currentTime, dt) glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) glutInitWindowSize(500, 500) glutInitWindowPosition(0,0) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutMotionFunc(mouseMotion) #glutPassiveMotionFunc(mouseMotion) glutTimerFunc(0, update, 0) glutMainLoop()