#!/usr/bin/env python2.3 # * 3-D gear wheels. This program is in the public domain. # * Brian Paul # * Conversion to GLUT by Mark J. Kilgard # conversion to Python using PyOpenGL with frame rates ala glxgears # Peter Barth from OpenGL.GL import * from OpenGL.GLUT import * import sys, time from math import sin,cos,sqrt,pi def gear(inner_radius, outer_radius, width, teeth, tooth_depth): r0 = inner_radius r1 = outer_radius - tooth_depth/2.0 r2 = outer_radius + tooth_depth/2.0 da = 2.0*pi / teeth / 4.0 glShadeModel(GL_FLAT) glNormal3f(0.0, 0.0, 1.0) # draw front face glBegin(GL_QUAD_STRIP) for i in range(teeth + 1): angle = i * 2.0 * pi / teeth glVertex3f(r0*cos(angle), r0*sin(angle), width*0.5) glVertex3f(r1*cos(angle), r1*sin(angle), width*0.5) glVertex3f(r0*cos(angle), r0*sin(angle), width*0.5) glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5) glEnd() # draw front sides of teeth glBegin(GL_QUADS) da = 2.0*pi / teeth / 4.0 for i in range(teeth): angle = i * 2.0*pi / teeth glVertex3f(r1*cos(angle), r1*sin(angle), width*0.5) glVertex3f(r2*cos(angle+da), r2*sin(angle+da), width*0.5) glVertex3f(r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5) glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5) glEnd() glNormal3f(0.0, 0.0, -1.0) # draw back face glBegin(GL_QUAD_STRIP) for i in range(teeth + 1): angle = i * 2.0*pi / teeth glVertex3f(r1*cos(angle), r1*sin(angle), -width*0.5) glVertex3f(r0*cos(angle), r0*sin(angle), -width*0.5) glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da),-width*0.5) glVertex3f(r0*cos(angle), r0*sin(angle), -width*0.5) glEnd() # draw back sides of teeth glBegin(GL_QUADS) da = 2.0*pi / teeth / 4.0 for i in range(teeth): angle = i * 2.0*pi / teeth glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da),-width*0.5) glVertex3f(r2*cos(angle+2*da), r2*sin(angle+2*da),-width*0.5) glVertex3f(r2*cos(angle+da), r2*sin(angle+da), -width*0.5) glVertex3f(r1*cos(angle), r1*sin(angle), -width*0.5) glEnd() # draw outward faces of teeth glBegin(GL_QUAD_STRIP); for i in range(teeth): angle = i * 2.0*pi / teeth glVertex3f(r1*cos(angle), r1*sin(angle), width*0.5) glVertex3f(r1*cos(angle), r1*sin(angle), -width*0.5) u = r2*cos(angle+da) - r1*cos(angle) v = r2*sin(angle+da) - r1*sin(angle) len = sqrt(u*u + v*v) u = u / len v = v / len glNormal3f(v, -u, 0.0) glVertex3f(r2*cos(angle+da), r2*sin(angle+da), width*0.5) glVertex3f(r2*cos(angle+da), r2*sin(angle+da), -width*0.5) glNormal3f(cos(angle), sin(angle), 0.0) glVertex3f(r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5) glVertex3f(r2*cos(angle+2*da), r2*sin(angle+2*da),-width*0.5) u = r1*cos(angle+3*da) - r2*cos(angle+2*da) v = r1*sin(angle+3*da) - r2*sin(angle+2*da) glNormal3f(v, -u, 0.0) glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5) glVertex3f(r1*cos(angle+3*da), r1*sin(angle+3*da),-width*0.5) glNormal3f(cos(angle), sin(angle), 0.0) glVertex3f(r1*cos(0), r1*sin(0), width*0.5) glVertex3f(r1*cos(0), r1*sin(0), -width*0.5) glEnd() glShadeModel(GL_SMOOTH) # draw inside radius cylinder glBegin(GL_QUAD_STRIP) for i in range(teeth + 1): angle = i * 2.0*pi / teeth; glNormal3f(-cos(angle), -sin(angle), 0.0) glVertex3f(r0*cos(angle), r0*sin(angle), -width*0.5) glVertex3f(r0*cos(angle), r0*sin(angle), width*0.5) glEnd() (view_rotx,view_roty,view_rotz)=(20.0, 30.0, 0.0) (gear1, gear2, gear3) = (0,0,0) angle = 0.0 tStart = t0 = time.time() frames = 0 rotationRate = 1.01 def framerate(): global t0, frames t = time.time() frames += 1 if t - t0 >= 5.0: seconds = t - t0 fps = frames/seconds print "%.0f frames in %3.1f seconds = %6.3f FPS" % (frames,seconds,fps) t0 = t frames = 0 def draw(): rotationRate = (time.time() - tStart) * 1.05 angle = (2 * pi) * ((time.time() - tStart)*rotationRate)# * rotationRate glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glPushMatrix() glRotatef(view_rotx, 1.0, 0.0, 0.0) glRotatef(view_roty, 0.0, 1.0, 0.0) glRotatef(view_rotz, 0.0, 0.0, 1.0) glPushMatrix() glTranslatef(-3.0, -2.0, 0.0) glRotatef(angle, 0.0, 0.0, 1.0) glCallList(gear1) glPopMatrix() glPushMatrix() glTranslatef(3.1, -2.0, 0.0) glRotatef(-2.0*angle-9.0, 0.0, 0.0, 1.0) glCallList(gear2) glPopMatrix() glPushMatrix() glTranslatef(-3.1, 4.2, 0.0) glRotatef(-2.0*angle-25.0, 0.0, 0.0, 1.0) glCallList(gear3) glPopMatrix() glPopMatrix() glutSwapBuffers() framerate() def idle(): global angle angle += 2.0 glutPostRedisplay() # change view angle, exit upon ESC def key(k, x, y): global view_rotz if k == 'z': view_rotz += 5.0 elif k == 'Z': view_rotz -= 5.0 elif ord(k) == 27: # Escape sys.exit(0) else: return glutPostRedisplay() # change view angle def special(k, x, y): global view_rotx, view_roty, view_rotz if k == GLUT_KEY_UP: view_rotx += 5.0 elif k == GLUT_KEY_DOWN: view_rotx -= 5.0 elif k == GLUT_KEY_LEFT: view_roty += 5.0 elif k == GLUT_KEY_RIGHT: view_roty -= 5.0 else: return glutPostRedisplay() # new window size or exposure def reshape(width, height): h = float(height) / float(width); glViewport(0, 0, width, height) glMatrixMode(GL_PROJECTION) glLoadIdentity() glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0, 0.0, -40.0) def init(): global gear1, gear2, gear3 pos = (5.0, 5.0, 10.0, 0.0) red = (0.8, 0.1, 0.0, 1.0) green = (0.0, 0.8, 0.2, 1.0) blue = (0.2, 0.2, 1.0, 1.0) glLightfv(GL_LIGHT0, GL_POSITION, pos) glEnable(GL_CULL_FACE) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_DEPTH_TEST) # make the gears gear1 = glGenLists(1) glNewList(gear1, GL_COMPILE) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red) gear(1.0, 4.0, 1.0, 20, 0.7) glEndList() gear2 = glGenLists(1) glNewList(gear2, GL_COMPILE) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green) gear(0.5, 2.0, 2.0, 10, 0.7) glEndList() gear3 = glGenLists(1) glNewList(gear3, GL_COMPILE) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue) gear(1.3, 2.0, 0.5, 10, 0.7) glEndList() glEnable(GL_NORMALIZE) def visible(vis): if vis == GLUT_VISIBLE: glutIdleFunc(idle) else: glutIdleFunc(None) if __name__ == '__main__': glutInit(sys.argv) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowPosition(0, 0) glutInitWindowSize(300, 300) glutCreateWindow("pyGears") init() glutDisplayFunc(draw) glutReshapeFunc(reshape) glutKeyboardFunc(key) glutSpecialFunc(special) glutVisibilityFunc(visible) if "-info" in sys.argv: print "GL_RENDERER = ", glGetString(GL_RENDERER) print "GL_VERSION = ", glGetString(GL_VERSION) print "GL_VENDOR = ", glGetString(GL_VENDOR) print "GL_EXTENSIONS = ", glGetString(GL_EXTENSIONS) glutMainLoop()