2006年06月13日 星期二 16:25
Skipped content of type multipart/alternative-------------- next part -------------- if __name__ == '__build__': raise Exception import string __version__ = string.split('$Revision: 1.8 $')[1] __date__ = string.join(string.split('$Date: 2006/06/10 04:13:56 $')[1:3], ' ') __author__ = 'Bing Ye <viscoplastic at gmail.com>' from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import sys from numpy import * from OpenGL.WGL import * # wglUseFontBitmaps (), wglGetCurrentDC () import win32ui # CreateFont (), CreateDCFromHandle () import Image # get PIL's functionality... # 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 # Rotation angle for the triangle. rtri = 0.0 # Rotation angle for the quadrilateral. rquad = 0.0 base = None couns = 1 def BuildFont (): global base wgldc = wglGetCurrentDC () hDC = win32ui.CreateDCFromHandle (wgldc) base = glGenLists(32+96); # // Storage For 96 Characters, plus 32 at the start... # CreateFont () takes a python dictionary to specify the requested font properties. font_properties = { "name" : "Courier New", "width" : 0 , "height" : 24, "weight" : 1600 } font = win32ui.CreateFont (font_properties) # // Selects The Font We Want oldfont = hDC.SelectObject (font) # // Builds 96 Characters Starting At Character 32 wglUseFontBitmaps (wgldc, 32, 96, base+32) # // reset the font hDC.SelectObject (oldfont) # // Delete The Font (python will cleanup font for us...) return def KillFont (): """ // Delete The Font List """ global base # // Delete All 96 Characters glDeleteLists (base, 32+96) return def glPrint (str): """ // Custom GL "Print" Routine """ global base # // If THere's No Text Do Nothing if (str == None): return if (str == ""): return glPushAttrib(GL_LIST_BIT); # // Pushes The Display List Bits try: glListBase(base); # // Sets The Base Character to 32 glCallLists(str) # // Draws The Display List Text finally: glPopAttrib(); # // Pops The Display List Bits return # 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) BuildFont () # 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) def Drawpolygon(): glBegin(GL_POLYGON); for i in range(10): glColor3f(rand(),rand(),rand()); glVertex3f(3*cos(4/3.0*pi)+3*cos(pi/3.0+i/9.0*pi/3.0),\ 3*sin(4/3.0*pi)+3*sin(pi/3.0+i/9.0*pi/3.0),0); for i in range(9,0,-1): glColor3f(1,rand(),rand()); glVertex3f(3*cos(2/3.0*pi)+3*cos(-pi/3.0-i/9.0*pi/3.0),\ 3*sin(2/3.0*pi)+3*sin(-pi/3.0-i/9.0*pi/3.0),0); glEnd(); # The main drawing function. def DrawGLScene(): global rtri, rquad, couns glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); # Clear The Screen And The Depth Buffer glLoadIdentity(); # Reset The View glTranslatef(-0,-0,-8); # Move Left And Into The Screen glRotatef(rtri,0.0,1.0,0.0); # Rotate The Pyramid On It's Y Axis # // Position The Text On The Screen glRasterPos2f(1,1); glPrint("Drew by Bing Ye" ); # // Print GL Text To The Screen #glBegin(GL_TRIANGLES); # Start Drawing The Pyramid glBegin(GL_LINE_LOOP); #glBegin(GL_POLYGON); # Red for i in range(20): glColor3f(rand(),rand(),rand()); glVertex3f(1*cos(i/10.0*pi),1*sin(i/10.0*pi),0); glEnd(); glBegin(GL_LINE_LOOP); for i in range(20): glColor3f(rand(),rand(),rand()); glVertex3f(2*cos(i/10.0*pi),2*sin(i/10.0*pi),0); glEnd(); for i in range(1,9): Drawpolygon() glRotatef(360*i/8.0,0.0,0.0,1.0); Drawpolygon() rtri = rtri + 2 # Increase The Rotation Variable For The Triangle rquad = rquad - 2.15 # Decrease The Rotation Variable For The Quad # since this is double buffered, swap the buffers to display what just got drawn. glutSwapBuffers() if couns < 10: width, height = 640,480 glPixelStorei(GL_PACK_ALIGNMENT, 1) data = glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE) image = Image.fromstring( "RGB", (width, height), data ) image = image.transpose( Image.FLIP_TOP_BOTTOM) image.save( 'help'+str(couns)+'.jpg' ) couns = couns + 1 # 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: sys.exit() def main(): global window glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | 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) window = glutCreateWindow("Bing's try") glutDisplayFunc(DrawGLScene) # Uncomment this line to get full screen. # glutFullScreen() # When we are doing nothing, redraw the scene. glutIdleFunc(DrawGLScene) # Register the function called when our window is resized. glutReshapeFunc(ReSizeGLScene) # Register the function called when the keyboard is pressed. glutKeyboardFunc(keyPressed) # 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()
2006年06月13日 星期二 16:58
On 6/13/06, V Plastic <viscoplastic at gmail.com> wrote: > 好像大家都是搞网络的。我不懂网络,不知道谁能不能介绍用python架设服务器的一些步骤。 > > 我用python是因为python对其他语言程序的包容性和python的简单。个人觉得绝大部分的东西python都能做出来,而且很容易学。 > > 我个人觉得那些讨论python的好坏的论题是不必要了,大家到这儿来是因为想学习和讨论python的一些应用,而不是天天说python好或差,难或易。 > > 附件中是我学习python opengl做的一个练习。在python里用opengl比c里面好像简单多了。 > > 搞网络与做web还是有区别的。其实这里做什么的都有。之所以讨论web因为这是一块很大的应用领域,也有许多可以学习的东西。 -- I like python! My Blog: http://www.donews.net/limodou My Django Site: http://www.djangocn.org NewEdit Maillist: http://groups.google.com/group/NewEdit
Zeuux © 2025
京ICP备05028076号