root / PyOpenGLDemo / NeHe / lesson11.py @ 1
History  View  Annotate  Download (5.4 kB)
1 
#! /usr/bin/env python


2 
# * coding: utf8 *

3 
# Conversion contributed by: Ivan Izuver <izuver@users.sourceforge.net>

4 
from OpenGL.GL import * 
5 
from OpenGL.GLU import * 
6 
from OpenGL.GLUT import * 
7  
8 
from math import sin 
9 

10 
import sys 
11 
import numpy # or Numeric 
12  
13  
14 
ESCAPE = '\033'

15  
16 
w_count=0

17 
hold = 0.0

18  
19 
# Number of the glut window.

20 
window = 0

21  
22 
# 3D array

23 
points = numpy.zeros((46, 46, 3), 'f') 
24  
25 
# rotation

26 
xrot = yrot = zrot = 0.0

27 

28 
# A general OpenGL initialization function. Sets all of the initial parameters.

29 
def InitGL(Width, Height): # We call this right after our OpenGL window is created. 
30 

31 
glClearColor(0.0, 0.0, 0.0, 0.0) # This Will Clear The Background Color To Black 
32 
glClearDepth(1.0) # Enables Clearing Of The Depth Buffer 
33 
glDepthFunc(GL_LESS) # The Type Of Depth Test To Do

34 
glEnable(GL_DEPTH_TEST) # Enables Depth Testing

35 
glShadeModel(GL_SMOOTH) # Enables Smooth Color Shading

36 

37 
glPolygonMode(GL_BACK,GL_FILL) 
38 
glPolygonMode(GL_FRONT,GL_LINE) 
39 

40 
# walk on plane X

41 
for x in xrange(45): 
42 
# walk on plane Y

43 
for y in xrange(45): 
44 
# apply wave to grid

45 
points[x][y][0]=float((x/5.0)4.5) 
46 
points[x][y][1]=float((y/5.0)4.5) 
47 
points[x][y][2]=float(sin((((x/5.0)*40.0)/360.0)*3.141592654*2.0)) 
48  
49 

50 
glMatrixMode(GL_PROJECTION) 
51 
glLoadIdentity() # Reset The Projection Matrix

52 
# Calculate The Aspect Ratio Of The Window

53 
gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0) 
54  
55 
glMatrixMode(GL_MODELVIEW) 
56  
57 
# The function called when our window is resized (which shouldn't happen if you enable fullscreen, below)

58 
def ReSizeGLScene(Width, Height): 
59 
if Height == 0: # Prevent A Divide By Zero If The Window Is Too Small 
60 
Height = 1

61  
62 
glViewport(0, 0, Width, Height) # Reset The Current Viewport And Perspective Transformation 
63 
glMatrixMode(GL_PROJECTION) 
64 
glLoadIdentity() 
65 
gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0) 
66 
glMatrixMode(GL_MODELVIEW) 
67  
68 
# The main drawing function.

69 
def DrawGLScene(): 
70 
global xrot,yrot,zrot,w_count

71 

72 
float_x=float_y=float_xb=float_yb=0.0 # for division our flag on small quads 
73 

74 
# Clear The Screen And The Depth Buffer

75 
glClear(GL_COLOR_BUFFER_BIT  GL_DEPTH_BUFFER_BIT) 
76 
glLoadIdentity() # Reset The View

77 

78 
glTranslatef(0.0,0.0,12.0) 
79 

80 
glRotatef(xrot,1.0,0.0,0.0) # rotate by x 
81 
glRotatef(yrot,0.0,1.0,0.0) # rotate by y 
82 
glRotatef(zrot,0.0,0.0,1.0) # rotate by z 
83 

84 
# build the wave

85 
glBegin(GL_QUADS) 
86 
for x in xrange(45): 
87 
for y in xrange(45): 
88 
float_x = float(x)/44.0 
89 
float_y = float(y)/44.0 
90 
float_xb = float(x+1)/44.0 
91 
float_yb = float(y+1)/44.0 
92 

93 
# bottom left

94 
glTexCoord2f(float_x, float_y) 
95 
glColor3f(0.0,0.0,0.0) 
96 
glVertex3f(points[x][y][0],points[x][y][1],points[x][y][2]) 
97 

98 
# upper left

99 
glTexCoord2f( float_x, float_yb ) 
100 
glColor3f(0.0,0.5,0.0) # set grid color 
101 
glVertex3f( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2]) 
102 

103 
# upper right

104 
glTexCoord2f( float_xb, float_yb ) 
105 
glVertex3f( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2]) 
106 

107 
# bottom right

108 
glTexCoord2f( float_xb, float_y ) 
109 
glVertex3f( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2]) 
110 

111 
glEnd() 
112 

113 
if w_count==2: # for slowing the wave 
114 
for y in xrange(45): # walk on plane Y 
115 
hold=points[0][y][2] # save the current value of left side one point 
116 
for x in xrange(45): # walk on plane Y 
117 
points[x][y][2] = points[x+1][y][2] 
118 
points[44][y][2]=hold 
119 
w_count = 1

120 
w_count+=1

121 

122 
# uncomment if need

123 
#xrot+=0.6

124 
#yrot+=0.5

125 
#zrot+=0.8

126 
# since this is double buffered, swap the buffers to display what just got drawn.

127 
glutSwapBuffers() 
128  
129 
# The function called whenever a key is pressed. Note the use of Python tuples to pass in: (key, x, y)

130 
def keyPressed(*args): 
131 
global window

132 
# If escape is pressed, kill everything.

133 
if args[0] == ESCAPE: 
134 
sys.exit() 
135  
136 
def main(): 
137 
global window

138 
# pass arguments to init

139 
glutInit(sys.argv) 
140  
141 
# Select type of Display mode:

142 
# Double buffer

143 
# RGBA color

144 
# Alpha components supported

145 
# Depth buffer

146 
glutInitDisplayMode(GLUT_RGBA  GLUT_DOUBLE  GLUT_DEPTH) 
147 

148 
# get a 640 x 480 window

149 
glutInitWindowSize(800, 600) 
150 

151 
# the window starts at the upper left corner of the screen

152 
glutInitWindowPosition(200, 200) 
153 

154 
# Okay, like the C version we retain the window id to use when closing, but for those of you new

155 
# to Python (like myself), remember this assignment would make the variable local and not global

156 
# if it weren't for the global declaration at the start of main.

157 
window = glutCreateWindow("Wave by RISC")

158  
159 
# Register the drawing function with glut, BUT in Python land, at least using PyOpenGL, we need to

160 
# set the function pointer and invoke a function to actually register the callback, otherwise it

161 
# would be very much like the C version of the code.

162 
glutDisplayFunc(DrawGLScene) 
163 

164 
# Uncomment this line to get full screen.

165 
#glutFullScreen()

166  
167 
# When we are doing nothing, redraw the scene.

168 
glutIdleFunc(DrawGLScene) 
169 

170 
# Register the function called when our window is resized.

171 
glutReshapeFunc(ReSizeGLScene) 
172 

173 
# Register the function called when the keyboard is pressed.

174 
glutKeyboardFunc(keyPressed) 
175  
176 
# Initialize our window.

177 
InitGL(640, 480) 
178  
179 
# Start Event Processing Engine

180 
glutMainLoop() 
181  
182 
# Print message to console, and kick off the main to get it rolling.

183 
if __name__ == "__main__": 
184 
print "Hit ESC key to quit." 
185 
main() 