import sys, time, math import struct from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * viewDistance = 15.0 viewRotY = 0.0 viewRotX = 0.0 cameraVelX = 0.0 cameraVelY = 0.0 prevTime = time.time() textureID = 0 def createTextureData(width,height): textureData = [ ] for i in range(0,height): for j in range(0,width): x = float(j) / width * math.pi y = float(i) / height * math.pi rgb = [ math.fabs(math.sin(x)*math.sin(y)), math.fabs(math.cos(x)*math.sin(y)), 0] rgb[0] = int(rgb[0] * 255) rgb[1] = int(rgb[1] * 255) rgb[2] = int(rgb[2] * 255) textureData.append(rgb) return textureData def createTextureString(rgbList): s = '' for rgb in rgbList: s += struct.pack('BBB', rgb[0], rgb[1], rgb[2]) return s def initTexture(): global textureID textureID = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, textureID) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); width = 32 height = 32 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, createTextureString(createTextureData(width,height))) glBindTexture(GL_TEXTURE_2D, 0) def draw(): glClearColor(0, 0.3, 0.5, 0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(50.0, 1.0, 1.0, 100.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0, 0.0, -viewDistance) glRotatef(viewRotX, 1.0, 0.0, 0.0) glRotatef(viewRotY, 0.0, 1.0, 0.0) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, textureID) glBegin(GL_QUADS) glTexCoord2f(0, 0) glVertex3f(-5, -5, 0) glTexCoord2f(1, 0) glVertex3f(5, -5, 0) glTexCoord2f(1, 1) glVertex3f(5, 5, 0) glTexCoord2f(0, 1) glVertex3f(-5, 5, 0) glEnd() glDisable(GL_TEXTURE_2D) glutSwapBuffers() def keyboard(key, x, y): global viewDistance if key == chr(27): sys.exit(0) elif key == '.': viewDistance -= 1 elif key == ',': viewDistance += 1 def specialkey(key,x,y): global cameraVelX, cameraVelY if key == GLUT_KEY_LEFT: cameraVelY += 90 elif key == GLUT_KEY_RIGHT: cameraVelY -= 90 elif key == GLUT_KEY_UP: cameraVelX += 90 elif key == GLUT_KEY_DOWN: cameraVelX -= 90 def specialkeyUp(key,x,y): global cameraVelX, cameraVelY if key == GLUT_KEY_LEFT: cameraVelY -= 90 elif key == GLUT_KEY_RIGHT: cameraVelY += 90 elif key == GLUT_KEY_UP: cameraVelX -= 90 elif key == GLUT_KEY_DOWN: cameraVelX += 90 def update(): global viewRotX, viewRotY, cameraVelX, cameraVelY global prevTime t = time.time() dt = t - prevTime prevTime = t viewRotX += cameraVelX * dt viewRotY += cameraVelY * dt glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutSpecialFunc(specialkey) glutSpecialUpFunc(specialkeyUp) glutIgnoreKeyRepeat(1) glutIdleFunc(update) glEnable(GL_DEPTH_TEST) initTexture() glutMainLoop()