from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * v = ((0,0,1), (0, .942809, -0.333333), (-.816497, -.471405, -.333333), (.816497, -.471405, -.333333)) mode = 0 def triangle(a,b,c): glVertexPointerf( [a,b,c] ) if mode == 1: # take the average of the vertices, use that for the whole triangle n = normal(add(add(a,b),c)) glNormalPointerf( [n,n,n] ) else: glNormalPointerf( [a,b,c] ) glDrawArrays( [GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLES][mode], 0, 3 ) def normal(p): import math d = math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]) return (p[0] / d, p[1] / d, p[2] / d) def divide_triangle(a,b,c,m): if m > 0: v1 = normal(add(a,b)) v2 = normal(add(a,c)) v3 = normal(add(b,c)) divide_triangle(a, v1, v2, m-1) divide_triangle(c, v2, v3, m-1) divide_triangle(b, v3, v1, m-1) divide_triangle(v1, v3, v2, m-1) else: triangle(a,b,c) def add(a,b): return (a[0]+b[0],a[1]+b[1],a[2]+b[2]) def tetrahedron(m): divide_triangle(v[0], v[1], v[2], m) divide_triangle(v[3], v[2], v[1], m) divide_triangle(v[0], v[3], v[1], m) divide_triangle(v[0], v[2], v[3], m) dl = 0 def display(): global dl if not dl: dl = 1 glNewList(1, GL_COMPILE) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() global mode mode = 0 tetrahedron(n) mode = 1 glTranslate(-2,0,0) tetrahedron(n) mode = 2 glTranslate(4,0,0) tetrahedron(n) glEndList() print 'list' print 'disp' glCallList(1) glFlush() def reshape(w,h): print w, h glViewport(0,0,w,h) glMatrixMode(GL_PROJECTION) glLoadIdentity() if w <= h: x,y = 2, 2*float(h)/w else: x,y = 2*float(w)/h, 2 glOrtho(-x,x,-y,y,-10,10) glMatrixMode(GL_MODELVIEW) def init(): glLight(GL_LIGHT0, GL_AMBIENT, (1,1,1,1)) glLight(GL_LIGHT0, GL_DIFFUSE, (1,1,1,1)) glLight(GL_LIGHT0, GL_SPECULAR, (1,1,1,1)) glMaterial(GL_FRONT, GL_AMBIENT, (0,0,0,1)) glMaterial(GL_FRONT, GL_DIFFUSE, (1,0,0,1)) glMaterial(GL_FRONT, GL_SPECULAR, (0,1,0,1)) glMaterial(GL_FRONT, GL_SHININESS, 100) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_DEPTH_TEST) glShadeModel(GL_SMOOTH) glClearColor(0,0,0,1) glColor3(0,0,0) glEnableClientState( GL_VERTEX_ARRAY ) glEnableClientState( GL_NORMAL_ARRAY ) if __name__ == '__main__': import sys, string try: n = string.atoi(sys.argv[1]) except: n = 4 glutInit([]) glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) glutInitWindowSize(500,300) glutInitWindowPosition(300,100) glutCreateWindow('Sphere') glutReshapeFunc (reshape) glutDisplayFunc (display) init() glutMainLoop()