import sys, time, math from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from dmsgl import * camera = OrthoCamera(-10,10, -10,10, -10,10) light = Light() material = Material(diffuse=Color.Blue) ballXform = SimpleTransform() ballPos = Vector([0,0,0]) ballVel = Vector([8,4.5,0]) class displayList: def __init__(self, func): self.func = func self.dlist = 0 self.__call__ = self.define def define(self): self.dlist = glGenLists(1) glNewList(self.dlist, GL_COMPILE) self.func() glEndList() self.__call__ = self.call self.call() def call(self): glCallList(self.dlist) def drawTetra(): Color.White.apply() glBegin(GL_TRIANGLE_FAN) glVertex3f(0, 0, -1) glVertex3f(-1, -1, 1) glVertex3f(1, -1, 1) glVertex3f(0, 1, 1) glVertex3f(-1, -1, 1) glEnd() Color.Red.apply() glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glBegin(GL_TRIANGLE_FAN) glVertex3f(0, 0, -1) glVertex3f(-1, -1, 1) glVertex3f(1, -1, 1) glVertex3f(0, 1, 1) glVertex3f(-1, -1, 1) glEnd() glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) drawTetra = displayList(drawTetra) def draw(): Color.Black.clear() camera.apply() light.apply() material.apply() ballXform.pushApply() gluSphere(quadric, 1.0, 32, 16) ballXform.pop() material.disable() drawTetra() glutSwapBuffers() def keyboard(key, x, y): global viewDistance if key == chr(27): sys.exit(0) prevTime = time.time() def checkForBounce(): if ballPos[0] > 10.0: ballVel[0] = -ballVel[0] ballPos[0] = 10.0 - (ballPos[0] - 10.0) elif ballPos[0] < -10.0: ballVel[0] = -ballVel[0] ballPos[0] = -10.0 + (-10.0 - ballPos[0]) if ballPos[1] > 10.0: ballVel[1] = -ballVel[1] ballPos[1] = 10.0 - (ballPos[1] - 10.0) elif ballPos[1] < -10.0: ballVel[1] = -ballVel[1] ballPos[1] = -10.0 + (-10.0 - ballPos[1]) def update(): global prevTime, ballPos, ballVel, ballXform t = time.time() dt = t - prevTime prevTime = t ballPos += ballVel * dt checkForBounce() ballXform.translate = ballPos 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()