import sys, time, math, os from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * from OpenGL.quaternion import * from dmsgl import * import Numeric mmult = Numeric.matrixmultiply startdir = os.getcwd() camera = PerspCamera() camera.moveBackward(15) def TranslationMatrix(x, y, z): return Numeric.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [x, y, z, 1]]) def RotationMatrix(angle, axisX, axisY, axisZ): angle *= -math.pi / 180.0 v = Vector((axisX, axisY, axisZ)) v.normalize() v *= math.sin(angle/2) return quaternion(math.cos(angle/2), v[0], v[1], v[2]).matrix4 matrix = [ TranslationMatrix(0, 0, 0), TranslationMatrix(0, 0, 0) ] rot2 = 0 drot2 = 20 bones = [ [ [0, 5, 0], [0, 0, 0] ], [ [0, 0, 0], [0, -5, 0] ] ] mesh = [ ] weight = [ ] for y in range(-50,51,5): mesh.append(Numeric.array([-1, y/10.0, 0, 1])) mesh.append(Numeric.array([1, y/10.0, 0, 1])) w = (y+50)/100.0 weight.append([w,1.0-w]) weight.append([w,1.0-w]) def draw(): Color.X11['DeepSkyBlue'].clear() camera.apply() glColor3f(1,0,0) for i in range(0,len(bones)): glPushMatrix() glMultMatrixf(matrix[i]) glBegin(GL_LINES) for v in bones[i]: glVertex3fv(v) glEnd() glPopMatrix() glColor3f(1,1,1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glBegin(GL_QUAD_STRIP) for j in range(0,len(mesh)): bv = Numeric.array([0,0,0,0]) for i in range(0,len(matrix)): bv = bv + weight[j][i] * mmult(mesh[j],matrix[i]) glVertex3fv(bv) glEnd() glutSwapBuffers() def keyboard(key, x, y): global cameraVelDist if key == chr(27): sys.exit(0) elif key == '.': cameraVelDist += 4 elif key == ',': cameraVelDist += -4 def keyboardUp(key, x, y): global cameraVelDist if key == chr(27): sys.exit(0) elif key == '.': cameraVelDist -= 4 elif key == ',': cameraVelDist -= -4 def specialkey(key,x,y): global cameraVelPitch, cameraVelTurn if key == GLUT_KEY_LEFT: cameraVelTurn += 90 elif key == GLUT_KEY_RIGHT: cameraVelTurn -= 90 elif key == GLUT_KEY_UP: cameraVelPitch += 90 elif key == GLUT_KEY_DOWN: cameraVelPitch -= 90 def specialkeyUp(key,x,y): global cameraVelPitch, cameraVelTurn if key == GLUT_KEY_LEFT: cameraVelTurn -= 90 elif key == GLUT_KEY_RIGHT: cameraVelTurn += 90 elif key == GLUT_KEY_UP: cameraVelPitch -= 90 elif key == GLUT_KEY_DOWN: cameraVelPitch += 90 cameraVelPitch = 0.0 cameraVelTurn = 0.0 cameraVelDist = 0.0 prevTime = time.time() startTime = time.time() def update(): global cameraVelPitch, cameraVelTurn, cameraVelDist, startTime, rot2, drot2 global prevTime t = time.time() dt = t - prevTime prevTime = t camera.pitch(cameraVelPitch * dt) camera.turn(cameraVelTurn * dt) camera.moveForward(cameraVelDist * dt) rot2 += drot2 * dt if rot2 > 90: drot2 = -20 elif rot2 < 0: drot2 = 20 matrix[1] = RotationMatrix(rot2, 0, 0, 1) glutPostRedisplay() glutInit([]) glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(400,400) glutCreateWindow(sys.argv[0]) glutDisplayFunc(draw) glutKeyboardFunc(keyboard) glutKeyboardUpFunc(keyboardUp) glutSpecialFunc(specialkey) glutSpecialUpFunc(specialkeyUp) glutIgnoreKeyRepeat(1) glutIdleFunc(update) os.chdir(startdir) glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glutMainLoop()