PyOpenGL 9 (マルチウインドウ)

マルチウインドウ

マルチウインドウを作成するには、glutCreateWindow(), glutCreateSubWindow()を使用します。
作成したウインドウそれぞれに設定を繰り返します。
どのウインドウに設定•描画をするかは、glutSetWindow()で切り換えます。

glutCreateSubWindow(win, x, y, w, h)
win
サブウインドウの親になるメインウインドウの番号
x
メインウインドウに対するサブウインドウ左上のX座標
y
メインウインドウに対するサブウインドウ左上のY座標
w
サブウインドウの横幅
h
サブウインドウの縦幅

マルチウインドウの例1 (2つのウインドウ)

  1. 以下のスクリプトを、pyopengl22.py というファイル名で保存します。
    #!env python
    
    from OpenGL.GL import *
    from OpenGL.GLU import *
    from OpenGL.GLUT import *
    
    
    vertex = [
        [ 0.0, 0.0, 0.0 ],
        [ 1.0, 0.0, 0.0 ],
        [ 1.0, 1.0, 0.0 ],
        [ 0.0, 1.0, 0.0 ],
        [ 0.0, 0.0, 1.0 ],
        [ 1.0, 0.0, 1.0 ],
        [ 1.0, 1.0, 1.0 ],
        [ 0.0, 1.0, 1.0 ]]
    
    edge = [
        [ 0, 1 ],
        [ 1, 2 ],
        [ 2, 3 ],
        [ 3, 0 ],
        [ 4, 5 ],
        [ 5, 6 ],
        [ 6, 7 ],
        [ 7, 4 ],
        [ 0, 4 ],
        [ 1, 5 ],
        [ 2, 6 ],
        [ 3, 7 ]]
    
    
    def resize1(w, h):
        glViewport(0, 0, w, h)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(30.0, w/h, 1.0, 100.0)
        glMatrixMode(GL_MODELVIEW)
    
    
    def resize2(w, h):
        glViewport(0, 0, w, h)
        glLoadIdentity()
        glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0)
    
    
    def draw1():
        glutSetWindow(winnum[0])
    
        glClearColor(0.0, 0.0, 1.0, 0.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
        glLoadIdentity()
        gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    
        glBegin(GL_LINES)
        for i in range(0, 12):
            glVertex(vertex[edge[i][0]])
            glVertex(vertex[edge[i][1]])
        glEnd()
    
        glFlush()
        glutSwapBuffers()
    
    
    def draw2():
        glutSetWindow(winnum[1])
    
        glClearColor(0.0, 0.0, 1.0, 0.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
        glBegin(GL_LINES)
        for i in range(0, 12):
            glVertex(vertex[edge[i][0]])
            glVertex(vertex[edge[i][1]])
        glEnd()
    
        glFlush()
        glutSwapBuffers()
    
    
    def keyboard(key, x, y):
        if key=='q':
            sys.exit()
    
    
    winnum = []
    
    glutInit(sys.argv)
    
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(320, 320)
    winnum.append(glutCreateWindow("PyOpenGL 22 1"))
    glutDisplayFunc(draw1)
    glutReshapeFunc(resize1)
    glutKeyboardFunc(keyboard)
    
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(320, 320)
    winnum.append(glutCreateWindow("PyOpenGL 22 2"))
    glutDisplayFunc(draw2)
    glutReshapeFunc(resize2)
    glutKeyboardFunc(keyboard)
    
    glutMainLoop()
    
  2. 以下のように実行します。
    # python pyopengl22.py
    [pyopengl38.ppm]

スクリプト解説

glutSetWindow(winnum[0])
カレントウインドウをwinnum[0]に設定します。
winnum = []
ウインドウの番号を代入しておくためのリストです。
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
1つ目のウインドウの、ディスプレイ表示モードの設定です。
glutInitWindowSize(320, 320)
1つ目のウインドウサイズの設定です。
winnum.append(glutCreateWindow("PyOpenGL 22 1"))
1つ目のウインドウを作成し、その番号をwinnum[0]に代入しておきます。
glutDisplayFunc(draw1)
1つ目の描画関数の登録です。
glutReshapeFunc(resize1)
1つ目のウインドウサイズを変更したとき実行する関数です。
glutKeyboardFunc(keyboard)
1つ目のウインドウでキーボードが押されたときに実行する関数です。
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
2つ目のウインドウの、ディスプレイ表示モードの設定です。
glutInitWindowSize(320, 320)
2つ目のウインドウサイズの設定です。
winnum.append(glutCreateWindow("PyOpenGL 22 2"))
2つ目のウインドウを作成し、その番号をwinnum[1]に代入しておきます。
glutDisplayFunc(draw2)
2つ目の描画関数の登録です。
glutReshapeFunc(resize2)
2つ目のウインドウサイズを変更したとき実行する関数です。
glutKeyboardFunc(keyboard)
2つ目のウインドウでキーボードが押されたときに実行する関数です。
同じ処理を行うので、1つ目のウインドウと関数を共有しています。

マルチウインドウの例2 (2つのサブウインドウ)

  1. 以下のスクリプトを、pyopengl23.py というファイル名で保存します。
    #!env python
    
    from OpenGL.GL import *
    from OpenGL.GLU import *
    from OpenGL.GLUT import *
    
    
    vertex = [
        [ 0.0, 0.0, 0.0 ],
        [ 1.0, 0.0, 0.0 ],
        [ 1.0, 1.0, 0.0 ],
        [ 0.0, 1.0, 0.0 ],
        [ 0.0, 0.0, 1.0 ],
        [ 1.0, 0.0, 1.0 ],
        [ 1.0, 1.0, 1.0 ],
        [ 0.0, 1.0, 1.0 ]]
    
    edge = [
        [ 0, 1 ],
        [ 1, 2 ],
        [ 2, 3 ],
        [ 3, 0 ],
        [ 4, 5 ],
        [ 5, 6 ],
        [ 6, 7 ],
        [ 7, 4 ],
        [ 0, 4 ],
        [ 1, 5 ],
        [ 2, 6 ],
        [ 3, 7 ]]
    
    
    def resize(w, h):
        glViewport(0, 0, w, h)
    
    
    def resize1(w, h):
        glViewport(0, 0, w, h)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(30.0, w/h, 1.0, 100.0)
        glMatrixMode(GL_MODELVIEW)
    
    
    def resize2(w, h):
        glViewport(0, 0, w, h)
        glLoadIdentity()
        glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0)
    
    
    def draw():
        glutSetWindow(winnum)
        glClearColor(1.0, 1.0, 1.0, 0.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
    
    def draw1():
        glutSetWindow(subwinnum[0])
    
        glClearColor(0.0, 1.0, 0.0, 0.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
        glLoadIdentity()
        gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    
        glBegin(GL_LINES)
        for i in range(0, 12):
            glVertex(vertex[edge[i][0]])
            glVertex(vertex[edge[i][1]])
        glEnd()
    
        glFlush()
        glutSwapBuffers()
    
    
    def draw2():
        glutSetWindow(subwinnum[1])
    
        glClearColor(0.0, 0.0, 1.0, 0.0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
        glBegin(GL_LINES)
        for i in range(0, 12):
            glVertex(vertex[edge[i][0]])
            glVertex(vertex[edge[i][1]])
        glEnd()
    
        glFlush()
        glutSwapBuffers()
    
    
    def keyboard(key, x, y):
        if key=='q':
            sys.exit()
    
    
    subwinnum = []
    
    glutInit(sys.argv)
    
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(646, 324)
    winnum = glutCreateWindow("PyOpenGL 23")
    glutDisplayFunc(draw)
    glutReshapeFunc(resize)
    
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(320, 320)
    subwinnum.append(glutCreateSubWindow(winnum, 2, 2, 320, 320))
    glutDisplayFunc(draw1)
    glutReshapeFunc(resize1)
    glutKeyboardFunc(keyboard)
    
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutInitWindowSize(320, 320)
    subwinnum.append(glutCreateSubWindow(winnum, 324, 2, 320, 320))
    glutDisplayFunc(draw2)
    glutReshapeFunc(resize2)
    glutKeyboardFunc(keyboard)
    
    glutMainLoop()
    
  2. 以下のように実行します。
    # python pyopengl23.py
    [pyopengl39.ppm]

スクリプト解説

subwinnum = []
サブウインドウの番号を入れておくためのリストです。
winnum = glutCreateWindow("PyOpenGL 23")
メインウインドを作成して、番号をwinnumに代入しておきます。
subwinnum.append(glutCreateSubWindow(winnum, 2, 2, 320, 320))
1つ目のサブウインドウを作成し、ウインドウ番号をsubwinnum[0]に代入しておきます。
subwinnum.append(glutCreateSubWindow(winnum, 324, 2, 320, 320))
2つ目のサブウインドウを作成し、ウインドウ番号をsubwinnum[1]に代入しておきます。

練習問題

  1. 前回のスクリプトを参考にして、サブウインドウを2つ作成し、異なる方向からオブジェクトを表示することができるようにしてみましょう。
    # python objdisplay24.py sphere.obj tmp3.ppm
    [2つのサブウインドウ]
    (提出ディレクトリ)
    aa1001xx.py というファイル名で以下のフォルダにコピーしてください。
    Z:\10AA\プログラム技術研究4\pyopengl24

参考


Prev
index | home
abetmhr@gmail.com