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

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

  1. なんでもいいので3次元の図形を描画(practice1.py)
  2. 描いた図形をマウスで回転できるようにする(practice2.py)    <--今。ここ。
  3. 複数の六面体を描画
  4. 描いた六面体をマウスで回転できるようにする
  5. より多くの六面体を描画する

practice1.pyからの変更点は、コメントが付けられた行だけ。マウスでの回転操作と、ウィンドウの大きさを変えたときの描画物体の大きさの変更を追加した。

# practice2.py
#
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import sys

ESCAPE = '\033'
lastx = x = 30
lasty = y = 30

def initialize():
    glClearDepth(1.0)
    glEnable(GL_DEPTH_TEST)
    glClearColor(0.0, 0.5, 0.0, 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(y, 1.0, 0.0, 0.0)
    glRotatef(x, 0.0, 1.0, 0.0)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE)
    glEnable(GL_COLOR_MATERIAL)

def mouseMotion(x, y):
    global lastx, lasty
    lastx = x
    lasty = y
    glutPostRedisplay()

def display():
    global lastx, lasty
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
    glPushMatrix()
    glRotatef(lastx, 0.0, 1.0, 0.0)  #マウスでの回転操作のために追加
    glRotatef(lasty, 1.0, 0.0, 0.0)  #マウスでの回転操作のために追加

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

    glPopMatrix()
    glutSwapBuffers()
    
def keyboard(*args):
    if args[0] == ESCAPE:
        sys.exit()

def reshape(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] )

    glutDisplayFunc( display )
    glutKeyboardFunc( keyboard )
    glutReshapeFunc( reshape )
    glutMotionFunc( mouseMotion )

    initialize()

    glutMainLoop()

print "Hit ESC key to quit."
main()

リモートでログインしたLinux上で実行すると、マウスでの回転操作ができない。動作がたいへん重い。ローカルでの実行は問題なく動作する。


クラスを使って、上のコードを書き変える。下のコードを実行しても動作は変わらない。

# practice2mod.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.0, 0.5, 0.0, 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)

    def mouseMotion(self, x, y):
        self.lastx = x
        self.lasty = y
        glutPostRedisplay()

    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)

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

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