描画した図形を回転させる(3)
PythonのOpenGLライブラリで、図形の描画を行う練習をしている。とりあえずは、以下のプロセスに沿って、いろいろと機能を試して進めていく。
- なんでもいいので3次元の図形を描画(practice1.py)
- 描いた図形をマウスで回転できるようにする(practice2mod.py) <--今、ここ。
- 表面が連続した四角形からなる物体を描画
- 描いた物体をマウスで回転できるようにする
- より多くの頂点を持つ物体を描画する
practice2mod.pyにおいて、ディスプレイリストを使って描画するように改良した。これで描画は高速になったはず。リモートのLinux上での実行は相変わらず動作が遅いが...。改良コードは以下の通り。
# practice2mod2.py # from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import sys ESCAPE = '\033' class QuadsPicture: def __init__(self): self.lastx = self.x = 30 self.lasty = self.y = 30 glClearDepth(1.0) glEnable(GL_DEPTH_TEST) glClearColor(0.9, 0.7, 0.7, 0.0) glShadeModel(GL_SMOOTH) glMatrixMode(GL_PROJECTION) glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0) glMatrixMode(GL_MODELVIEW) glTranslatef(0.0, 0.0, -2.0) glRotatef(self.y, 1.0, 0.0, 0.0) glRotatef(self.x, 0.0, 1.0, 0.0) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE) glEnable(GL_COLOR_MATERIAL) self.displaylist() #ディスプレイリストを生成するメソッド def mouseMotion(self, x, y): self.lastx = x self.lasty = y glutPostRedisplay() def displaylist(self): self.index = glGenLists(1) #ディスプレイリスト名の生成 glNewList(self.index, GL_COMPILE_AND_EXECUTE) #ディスプレイリスト作成開始 glBegin(GL_QUADS) glNormal3f( 0.0, 0.0, 1.0) glVertex3f( 0.5, 0.5, 0.5) glVertex3f(-0.5, 0.5, 0.5) glVertex3f(-0.5,-0.5, 0.5) glVertex3f( 0.5,-0.5, 0.5) glNormal3f( 0.0, 0.0,-1.0) glVertex3f(-0.5,-0.5,-0.5) glVertex3f(-0.5, 0.5,-0.5) glVertex3f( 0.5, 0.5,-0.5) glVertex3f( 0.5,-0.5,-0.5) glNormal3f( 0.0, 1.0, 0.0) glVertex3f( 0.5, 0.5, 0.5) glVertex3f( 0.5, 0.5,-0.5) glVertex3f(-0.5, 0.5,-0.5) glVertex3f(-0.5, 0.5, 0.5) glNormal3f( 0.0,-1.0, 0.0) glVertex3f(-0.5,-0.5,-0.5) glVertex3f( 0.5,-0.5,-0.5) glVertex3f( 0.5,-0.5, 0.5) glVertex3f(-0.5,-0.5, 0.5) glNormal3f( 1.0, 0.0, 0.0) glVertex3f( 0.5, 0.5, 0.5) glVertex3f( 0.5,-0.5, 0.5) glVertex3f( 0.5,-0.5,-0.5) glVertex3f( 0.5, 0.5,-0.5) glNormal3f(-1.0, 0.0, 0.0) glVertex3f(-0.5,-0.5,-0.5) glVertex3f(-0.5,-0.5, 0.5) glVertex3f(-0.5, 0.5, 0.5) glVertex3f(-0.5, 0.5,-0.5) glEnd() glEndList() #ディスプレイリスト作成終了 def display(self): glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) glPushMatrix() glRotatef(self.lastx, 0.0, 1.0, 0.0) glRotatef(self.lasty, 1.0, 0.0, 0.0) glCallList(self.index) #ディスプレイリストの描画 glPopMatrix() glutSwapBuffers() def keyboard(self, *args): if args[0] == ESCAPE: sys.exit() def reshape(self, w, h): glViewport(0, 0, w, h) def main(): glutInit(sys.argv) glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ) glutInitWindowPosition( 100, 100 ) glutInitWindowSize( 500, 400 ) glutCreateWindow( sys.argv[0] ) qp = QuadsPicture() glutDisplayFunc( qp.display ) glutKeyboardFunc( qp.keyboard ) glutReshapeFunc( qp.reshape ) glutMotionFunc( qp.mouseMotion ) glutMainLoop() print "Hit ESC key to quit." main()