PyOpenGL

PyOpenGLとは

PyOpenGL は、Python で OpenGL を使用するためのモジュールです。

空のウインドウ

#!/usr/bin/python

from OpenGL.GL import *
from OpenGL.GLUT import *


def draw():
    glClearColor(1.0, 0.0, 0.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glFlush()
    glutSwapBuffers()


glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(320, 240)
glutCreateWindow("PyOpenGL 1")
glutDisplayFunc(draw)

glutMainLoop()

スクリプト解説

from OpenGL.GL import *
OpenGL.GL モジュールを読み込みます。
from ... import によって、モジュール名をつけなくてもメソッドが使用できます。
from OpenGL.GLUT import *
OpenGL.GLUT モジュールを読み込みます。
glClearColor(1.0, 0.0, 0.0, 0.0)
赤色で全体を塗りつぶします。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
カラーバッファとデプスバッファをクリアします。
glFlush()
まだ実行されていない OpenGL の命令を全部実行します。
glutSwapBuffers()
バッファを入れ替えて、描画されたバッファを前面に表示します。
glutInit(sys.argv)
GLUT の初期化です。
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
ディスプレイの表示モードを設定します。
glutInitWindowSize(320, 240)
ウインドウのサイズを 320 X 240 にします。
glutCreateWindow("PyOpenGL 1")
タイトルを PyOpenGL 1 にして、ウインドウを作成します。
glutDisplayFunc(draw)
ウィンドウを再描画するイベントが発生したとき実行される関数を登録します。
glutMainLoop()
イベント待ちの状態で、無限ループに入ります。

ポリゴン描画

#!/usr/bin/python

from OpenGL.GL import *
from OpenGL.GLUT import *


def draw():
    glClearColor(0.0, 0.0, 1.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glBegin(GL_TRIANGLES)
    glVertex(-1, -1)
    glVertex(1, -1)
    glVertex(0, 1)
    glEnd()

    glFlush()
    glutSwapBuffers()

glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(320, 240)
glutCreateWindow("PyOpenGL 2")
glutDisplayFunc(draw)

glutMainLoop()

スクリプト解説

glBegin(GL_TRIANGLES)
三角形の描画を始めます。
glVertex(-1, -1)
(-1, -1)の点の指定です。
glEnd()
三角形の描画の終わりです。

ビューポート

#!/usr/bin/python

from OpenGL.GL import *
from OpenGL.GLUT import *


def resize(w, h):
    glViewport(30, 50, w/2, h/2)

def draw():
    glClearColor(0.0, 1.0, 0.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glBegin(GL_TRIANGLES)
    glVertex(-1, -1)
    glVertex(1, -1)
    glVertex(0, 1)
    glEnd()

    glBegin(GL_LINES)
    glVertex(-1, -1)
    glVertex(1, -1)
    glVertex(1, -1)
    glVertex(1, 1)
    glVertex(1, 1)
    glVertex(-1, 1)
    glVertex(-1, 1)
    glVertex(-1, -1)
    glEnd()

    glFlush()
    glutSwapBuffers()


glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(320, 240)
glutCreateWindow("PyOpenGL 3")
glutReshapeFunc(resize)
glutDisplayFunc(draw)

glutMainLoop()

スクリプト解説

glViewport(30, 50, w/2, h/2)
ビューポートを(30, 50)から、(30 + w/2, 50 + h/2)の範囲に設定します。
glutReshapeFunc(resize)
ウインドウの大きさを変えたとき実行する関数を登録します。

マウス

#!/usr/bin/python

from OpenGL.GL import *
from OpenGL.GLUT import *


def draw():
    glClearColor(0.0, 0.5, 0.5, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glBegin(GL_TRIANGLES)
    glVertex(-1, -1)
    glVertex(1, -1)
    glVertex(0, 1)
    glEnd()

    glFlush()
    glutSwapBuffers()


def resize(w, h):
    glViewport(0, 0, w, h)


def mouse(button, state, x, y):
    if button == GLUT_LEFT_BUTTON:
        print "left button",
    elif button == GLUT_MIDDLE_BUTTON:
        print "middle button",
    elif button == GLUT_RIGHT_BUTTON:
        print "right button",
    else:
        print "unknown button:", button,

    if state == GLUT_DOWN:
        print "down mouse button",
    elif state == GLUT_UP:
        print "up mouse button",
    else:
        print "unknown state:", state,

    print(x, y)


def motion(x, y):
    print "drag:", x, y


glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(320, 240)
glutCreateWindow("PyOpenGL 4")
glutReshapeFunc(resize)
glutDisplayFunc(draw)
glutMouseFunc(mouse)
glutMotionFunc(motion)

glutMainLoop()

スクリプト解説

def mouse(button, state, x, y):
マウスが押されたときに実行される関数です。
button には、以下のいづれかの値が入っています。
GLUT_LEFT_BUTTON
マウス左ボタン
GLUT_MIDDLE_BUTTON
マウス中ボタン
GLUT_RIGHT_BUTTON
マウス右ボタン
state には、以下のいづれかの値が入っています。
GLUT_DOWN
マウスボタンが押された
GLUT_UP
マウスボタンが離された
def motion(x, y):
マウスがドラッグされたときに実行される関数です。
glutMouseFunc(mouse)
マウスが押されたときに実行される関数を登録します。
glutMotionFunc(motion)
マウスがドラッグされたときに実行される関数を登録します。

キーボード

#!/usr/bin/python

from OpenGL.GL import *
from OpenGL.GLUT import *


def draw():
    glClearColor(0.0, 0.5, 0.5, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glBegin(GL_TRIANGLES)
    glVertex(-1, -1)
    glVertex(1, -1)
    glVertex(0, 1)
    glEnd()

    glFlush()
    glutSwapBuffers()


def resize(w, h):
    glViewport(0, 0, w, h)


def mouse(button, state, x, y):
    if button == GLUT_LEFT_BUTTON:
        print "left button",
    elif button == GLUT_MIDDLE_BUTTON:
        print "middle button",
    elif button == GLUT_RIGHT_BUTTON:
        print "right button",
    else:
        print "unknown button:", button,

    if state == GLUT_DOWN:
        print "down mouse button",
    elif state == GLUT_UP:
        print "up mouse button",
    else:
        print "unknown state:", state,

    print(x, y)


def motion(x, y):
    print "drag:", x, y


def keyboard(key, x, y):
    if key == '\033':
        sys.exit()
    elif key == 'q':
        sys.exit()
    else:
        print(key)


glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(320, 240)
glutCreateWindow("PyOpenGL 5")
glutReshapeFunc(resize)
glutDisplayFunc(draw)
glutMouseFunc(mouse)
glutMotionFunc(motion)
glutKeyboardFunc(keyboard)

glutMainLoop()

スクリプト解説

def keyboard(key, x, y):
キーが押されたときに実行される関数です。
key に押されたキーの文字が入っています。
glutKeyboardFunc(keyboard)
キーが押されたときに実行される関数を登録します。

練習問題

  1. ラバーバンドによって、大きさを決めて四角形が描かれるようにしてみましょう。

参考


Prev | Next
index | home
abetmhr@gmail.com