Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- #
- # This code was created by Richard Campbell '99 (ported to Python/PyOpenGL by John Ferguson 2000)
- #
- # The port was based on the PyOpenGL tutorial module: dots.py
- #
- # If you've found this code useful, please let me know (email John Ferguson at hakuin@voicenet.com).
- #
- # See original source and C based tutorial at http://nehe.gamedev.net
- #
- # Note:
- # -----
- # This code is not a good example of Python and using OO techniques. It is a simple and direct
- # exposition of how to use the Open GL API in Python via the PyOpenGL package. It also uses GLUT,
- # which in my opinion is a high quality library in that it makes my work simpler. Due to using
- # these APIs, this code is more like a C program using function based programming (which Python
- # is in fact based upon, note the use of closures and lambda) than a "good" OO program.
- #
- # To run this code get and install OpenGL, GLUT, PyOpenGL (see http://www.python.org), and PyNumeric.
- # Installing PyNumeric means having a C compiler that is configured properly, or so I found. For
- # Win32 this assumes VC++, I poked through the setup.py for Numeric, and chased through disutils code
- # and noticed what seemed to be hard coded preferences for VC++ in the case of a Win32 OS. However,
- # I am new to Python and know little about disutils, so I may just be not using it right.
- #
- # BTW, since this is Python make sure you use tabs or spaces to indent, I had numerous problems since I
- # was using editors that were not sensitive to Python.
- #
- from OpenGL.GL import *
- from OpenGL.GLUT import *
- from OpenGL.GLU import *
- # Some api in the chain is translating the keystrokes to this octal string
- # so instead of saying: ESCAPE = 27, we use the following.
- ESCAPE = '\033'
- # Number of the glut window.
- window = 0
- # A general OpenGL initialization function. Sets all of the initial parameters.
- def InitGL(Width, Height): # We call this right after our OpenGL window is created.
- glClearColor(0.0, 0.0, 0.0, 0.0) # This Will Clear The Background Color To Black
- glClearDepth(1.0) # Enables Clearing Of The Depth Buffer
- glDepthFunc(GL_LESS) # The Type Of Depth Test To Do
- glEnable(GL_DEPTH_TEST) # Enables Depth Testing
- glShadeModel(GL_SMOOTH) # Enables Smooth Color Shading
- glMatrixMode(GL_PROJECTION)
- glLoadIdentity() # Reset The Projection Matrix
- # Calculate The Aspect Ratio Of The Window
- gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
- glMatrixMode(GL_MODELVIEW)
- # The function called when our window is resized (which shouldn't happen if you enable fullscreen, below)
- def ReSizeGLScene(Width, Height):
- if Height == 0: # Prevent A Divide By Zero If The Window Is Too Small
- Height = 1
- glViewport(0, 0, Width, Height) # Reset The Current Viewport And Perspective Transformation
- glMatrixMode(GL_PROJECTION)
- glLoadIdentity()
- gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
- glMatrixMode(GL_MODELVIEW)
- # The main drawing function.
- def DrawGLScene():
- # Clear The Screen And The Depth Buffer
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
- glLoadIdentity() # Reset The View
- # Move Left 1.5 units and into the screen 6.0 units.
- glTranslatef(-1.5, 0.0, -6.0)
- # Since we have smooth color mode on, this will be great for the Phish Heads :-).
- # Draw a triangle
- glBegin(GL_POLYGON) # Start drawing a polygon
- glColor3f(1.0, 0.0, 0.0) # Red
- glVertex3f(0.0, 1.0, 0.0) # Top
- glColor3f(0.0, 1.0, 0.0) # Green
- glVertex3f(1.0, -1.0, 0.0) # Bottom Right
- glColor3f(0.0, 0.0, 1.0) # Blue
- glVertex3f(-1.0, -1.0, 0.0) # Bottom Left
- glEnd() # We are done with the polygon
- # Move Right 3.0 units.
- glTranslatef(3.0, 0.0, 0.0)
- # Draw a square (quadrilateral)
- glColor3f(0.3, 0.5, 1.0) # Bluish shade
- glBegin(GL_QUADS) # Start drawing a 4 sided polygon
- glVertex3f(-1.0, 1.0, 0.0) # Top Left
- glVertex3f(1.0, 1.0, 0.0) # Top Right
- glVertex3f(1.0, -1.0, 0.0) # Bottom Right
- glVertex3f(-1.0, -1.0, 0.0) # Bottom Left
- glEnd() # We are done with the polygon
- # since this is double buffered, swap the buffers to display what just got drawn.
- glutSwapBuffers()
- # The function called whenever a key is pressed. Note the use of Python tuples to pass in: (key, x, y)
- def keyPressed(*args):
- # If escape is pressed, kill everything.
- if args[0] == ESCAPE:
- glutDestroyWindow(window)
- sys.exit()
- def main():
- global window
- # For now we just pass glutInit one empty argument. I wasn't sure what should or could be passed in (tuple, list, ...)
- # Once I find out the right stuff based on reading the PyOpenGL source, I'll address this.
- glutInit("")
- # Select type of Display mode:
- # Double buffer
- # RGBA color
- # Alpha components supported
- # Depth buffer
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
- # get a 640 x 480 window
- glutInitWindowSize(640, 480)
- # the window starts at the upper left corner of the screen
- glutInitWindowPosition(0, 0)
- # Okay, like the C version we retain the window id to use when closing, but for those of you new
- # to Python (like myself), remember this assignment would make the variable local and not global
- # if it weren't for the global declaration at the start of main.
- window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99")
- # Register the drawing function with glut, BUT in Python land, at least using PyOpenGL, we need to
- # set the function pointer and invoke a function to actually register the callback, otherwise it
- # would be very much like the C version of the code.
- glutSetDisplayFuncCallback(DrawGLScene)
- glutDisplayFunc()
- # Uncomment this line to get full screen.
- #glutFullScreen()
- # When we are doing nothing, redraw the scene.
- glutSetIdleFuncCallback(DrawGLScene)
- glutIdleFunc()
- # Register the function called when our window is resized.
- glutSetReshapeFuncCallback(ReSizeGLScene)
- glutReshapeFunc()
- # Register the function called when the keyboard is pressed.
- glutSetKeyboardFuncCallback(keyPressed)
- glutKeyboardFunc()
- # Initialize our window.
- InitGL(640, 480)
- # Start Event Processing Engine
- glutMainLoop()
- # Print message to console, and kick off the main to get it rolling.
- print "Hit ESC key to quit."
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement