import sys, time, math from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from dmsgl import * import Image from random import * camera = PerspCamera() camera.pitch(-30) camera.moveBackward(20) class waveSurface: def __init__(self, resolution, size, yscale): self.resolution = resolution self.size = size self.yscale = yscale self.height = [] self.velocity = [] for i in range(0, resolution): self.height.append([0]*resolution) self.velocity.append([0]*resolution) def draw(self): xzstep = self.size / (self.resolution - 1.0) z = -self.size/2 for row in range(0, self.resolution-1): x = -self.size/2 glBegin(GL_QUAD_STRIP) for col in range(0, self.resolution): glVertex3f(x, self.height[row][col]*self.yscale, z) glVertex3f(x, self.height[row+1][col]*self.yscale, z+xzstep) x = x + xzstep glEnd() z = z + xzstep def update(self, dt): for row in range(1, self.resolution-1): for col in range(1, self.resolution-1): accel = ((self.height[row+1][col] + self.height[row-1][col] + self.height[row][col+1] + self.height[row][col-1]) / 4 -self.height[row][col]) * 25 accel -= self.velocity[row][col] * 0.1 self.velocity[row][col] += accel * dt self.height[row][col] += self.velocity[row][col] * dt waves = waveSurface(25, 10, 1) waves.height[8][8] = 2 angle = 0 def draw(): Color.Black.clear() camera.apply() glRotatef(angle, 0, 1, 0) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) waves.draw() glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) glutSwapBuffers() def keyboard(key, x, y): global viewDistance if key == chr(27): sys.exit(0) elif key == ' ': waves.height[8][8] = 5 prevTime = time.time() def update(): global prevTime, angle t = time.time() dt = t - prevTime prevTime = t angle += .1 waves.update(dt) # time.sleep(0.2) glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutIdleFunc(update) glEnable(GL_DEPTH_TEST) quadric = gluNewQuadric() glutMainLoop()