jsuarez/tools/gl.py (81 lines of code) (raw):

# author: Somsubhra Bairi (201101056) # Draws a polyhedron by cutting corners of cube # Controls: UP - rotate up # DOWN - rotate down # LEFT - rotate left # RIGHT - rotate right # OpenGL imports for python try: from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * except: print("OpenGL wrapper for python not found") # The cube class class Cube: # Constructor for the cube class def __init__(self): self.rotate_y = 0.0 self.rotate_x = 0.0 self.scale = 2.0 # Initialize def init(self): # Set background to black glClearColor(0.0, 0.0, 0.0, 0.0) # Set the shade model to flat glShadeModel(GL_FLAT) # Draw half of the cube with corners cut def draw_half(self, mirror): # The plane equations cutting corners of cube eqn = [-1.0, 0.0, 0.0, 0.0] eqn1 = [1.0, 1.0, 1.0, 1.25] eqn2 = [1.0, -1.0, 1.0, 1.25] eqn3 = [1.0, 1.0, -1.0, 1.25] eqn4 = [1.0, -1.0, -1.0, 1.25] eqn5 = [-1.0, 1.0, 1.0, 1.25] # Set the color to white glColor3f(1.0, 1.0, 1.0) # Reset the matrix glLoadIdentity() # Set the camera gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) if mirror: glScalef(-self.scale, self.scale, self.scale) glRotatef(-self.rotate_y, 0.0, 1.0, 0.0) else: glScalef(self.scale, self.scale, self.scale) glRotatef(self.rotate_y, 0.0, 1.0, 0.0) glRotatef(self.rotate_x, 1.0, 0.0, 0.0) # Draw solid cube glutSolidCube(1.0) # Draw a red wire cube to highlight the background glColor3f(1.0, 0.0, 0.0) glutWireCube(1.0) # Clip the corners of the cube with these equations glClipPlane(GL_CLIP_PLANE0, eqn1) glEnable(GL_CLIP_PLANE0) glClipPlane(GL_CLIP_PLANE1, eqn2) glEnable(GL_CLIP_PLANE1) glClipPlane(GL_CLIP_PLANE2, eqn3) glEnable(GL_CLIP_PLANE2) glClipPlane(GL_CLIP_PLANE3, eqn4) glEnable(GL_CLIP_PLANE3) glClipPlane(GL_CLIP_PLANE4, eqn5) glEnable(GL_CLIP_PLANE4) # Cut the cube into half glClipPlane(GL_CLIP_PLANE5, eqn) glEnable(GL_CLIP_PLANE5) glFlush() # The display function def display(self): glClear(GL_COLOR_BUFFER_BIT) # Draw half the cube with corners cut self.draw_half(False) # Draw a mirror image of the above half cube self.draw_half(True) # The reshape function def reshape(self, w, h): glViewport(0, 0, GLsizei(w), GLsizei(h)) glMatrixMode(GL_PROJECTION) glLoadIdentity() glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0) glMatrixMode(GL_MODELVIEW) # The keyboard controls def special(self, key, x, y): # Rotate cube according to keys pressed if key == GLUT_KEY_RIGHT: self.rotate_y += 5 if key == GLUT_KEY_LEFT: self.rotate_y -= 5 if key == GLUT_KEY_UP: self.rotate_x += 5 if key == GLUT_KEY_DOWN: self.rotate_x -= 5 glutPostRedisplay() # The main function def main(): # Initialize OpenGL glutInit(sys.argv) # Set display mode glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) # Set size and position of window size glutInitWindowSize(400, 400) glutInitWindowPosition(100, 100) # Create window with given title glutCreateWindow("Cube") # Instantiate the cube cube = Cube() cube.init() # The callback for display function glutDisplayFunc(cube.display) # The callback for reshape function glutReshapeFunc(cube.reshape) # The callback function for keyboard controls glutSpecialFunc(cube.special) # Start the main loop glutMainLoop() # Call the main function if __name__ == '__main__': main()