描画した図形を回転させる(3)

PythonOpenGLライブラリで、図形の描画を行う練習をしている。とりあえずは、以下のプロセスに沿って、いろいろと機能を試して進めていく。

  1. なんでもいいので3次元の図形を描画(practice1.py)
  2. 描いた図形をマウスで回転できるようにする(practice2mod.py) <--今、ここ。
  3. 表面が連続した四角形からなる物体を描画
  4. 描いた物体をマウスで回転できるようにする
  5. より多くの頂点を持つ物体を描画する

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()