import sys, string from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * class OBJFace: def __init__(self, vertices, obj): self.vertices = vertices self.obj = obj def draw(self): glBegin(GL_POLYGON) for v in self.vertices: glVertex3fv(self.obj.vertices[v-1]) glEnd() class OBJUseMtl: def __init__(self, mtl): self.material = mtl def draw(self): if self.material.has_key('Kd'): glColor3fv(self.material['Kd']) class OBJFile: def __init__(self, filename): self.vertices = [] self.materials = {} self.commands = [] file = open(filename, "r") lines = file.readlines() for line in lines: values = string.split(line) if len(values) < 1: continue if values[0] == 'v': x = string.atof(values[1]) y = string.atof(values[2]) z = string.atof(values[3]) self.vertices.append([x,y,z]) elif values[0] == 'mtllib': self.loadMtllib(values[1]) elif values[0] == 'f': face = [] for v in values[1:]: w = string.split(v,'/') face.append(string.atoi(w[0])) self.commands.append(OBJFace(face,self)) elif values[0] == 'usemtl': if self.materials.has_key(values[1]): self.commands.append(OBJUseMtl(self.materials[values[1]])) else: print 'Warning: %s trying to use unknown material %s' % (filename, values[1]) def loadMtllib(self, filename): for line in open(filename, "r").readlines(): values = string.split(line) if len(values) < 1: continue if values[0] == 'newmtl': mtl = {} self.materials[values[1]] = mtl elif values[0] == 'Kd': r = string.atof(values[1]) g = string.atof(values[2]) b = string.atof(values[3]) mtl['Kd'] = [ r, g, b ] def draw(self): for c in self.commands: c.draw() viewRotY = 0 viewRotX = 0 cow = OBJFile("cow.obj") def draw(): glClear(GL_COLOR_BUFFER_BIT) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(-10, 10, -10, 10, -10, 10) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glRotatef(viewRotX, 1.0, 0.0, 0.0) glRotatef(viewRotY, 0.0, 1.0, 0.0) cow.draw() glutSwapBuffers() def keyboard(key, x, y): if key == chr(27): sys.exit(0) def specialkey(key,x,y): global viewRotX, viewRotY if key == GLUT_KEY_LEFT: viewRotY = viewRotY + 3 elif key == GLUT_KEY_RIGHT: viewRotY = viewRotY - 3 elif key == GLUT_KEY_UP: viewRotX = viewRotX + 3 elif key == GLUT_KEY_DOWN: viewRotX = viewRotX - 3 glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutSpecialFunc(specialkey) glutMainLoop()