PyOpenGL 2

ワイヤーフレーム表示 (3D)

ワイヤーフレームで、立方体を表示してみましょう。
カメラは、正射影です。

#!/usr/bin/python

from OpenGL.GL 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)
    glLoadIdentity()
    glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0)


def draw():
    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()

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

glutMainLoop()

スクリプト解説

glLoadIdentity()
座標変換行列を初期化します。
変換行列が単位行列になります。
glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 2.0)
ワールド座標系を平行投影する行列を変換行列に乗じます。
引数は左から、表示領域の左端、右端、下端、上端、前方面、後方面の位置です。

回転 (3D)

ワイヤーフレームの立方体をパースペクティブに表示して、キーボードで回転できるようにしてみましょう。
以下のスクリプトで、h キーを押すと Y 軸周りに 1 度回転します。

#!/usr/bin/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 ]]

angle = 0.0


def resize(w, h):
    glViewport(0, 0, w, h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(30.0, w/h, 1.0, 100.0)
    glMatrixMode(GL_MODELVIEW)


def draw():
    global angle

    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)
    glRotated(angle, 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 keyboard(key, x, y):
    global angle
    if key=='q':
        sys.exit()
    if key=='h':
        angle += 1.0
        glutPostRedisplay()

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

glutMainLoop()

スクリプト解説

from OpenGL.GLU import *
GLU モジュールをインポートします。
透視変換や、視点の変換に必要です。
glMatrixMode(GL_PROJECTION)
設定する変換行列として透視変換行列を指定します。
gluPerspective(30.0, w/h, 1.0, 100.0)
変換行列に透視変換行列を乗じます。
引数の意味は以下の通りです。
最初の引数 30.0
カメラの画角(度)です。
大きいほどワイドレンズ、 小さいほど望遠レンズになります。
二つ目の引数 w/h
画面のアスペクト比(縦横比)です。
1.0 であればビューポートに表示される図形の X 方向と Y 方向のスケールが等しくなります。
三つ目の引数 1.0、四つ目の引数 100.0
表示を行う奥行き方向の範囲です。
この場合は、視点からの距離が 1.0 〜 100.0 の範囲が表示されます。
glMatrixMode(GL_MODELVIEW)
設定する変換行列としてモデルビュー変換行列を指定します。
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
視点の変更をします。
引数の意味は以下の通りです。
最初の三つの引数 3.0, 4.0, 5.0
視点の位置
次の三つの引数 0.0, 0.0, 0.0
目標の位置
最後の三つの引数 0.0, 1.0, 0.0
視点の上方向を示すベクトル
glRotated(angle, 0.0, 1.0, 0.0)
変換行列に回転の行列を乗じます。
最初の引数 angle が回転角度、次の三つ 0.0, 1.0, 0.0 が回転軸を表す方向ベクトルです。
glutPostRedisplay()
再描画イベントを発生させ、 glutDisplayFunc() で指定されている関数が実行されます。
再描画が開始されるまでの間に再描画イベントが発生しても無視されます。

練習問題

  1. マウスを使って、立方体を回転できるようにしてみましょう。
    マウス左ボタンのドラッグで X 方向、中ボタンで Y 方向、右ボタンで Z 方向に回転するようにします。

参考


Prev | Next
index | home
abetmhr@gmail.com