PyOpenGL 3

フェース表示

陰面消去したポリゴンを表示してみましょう。

#!env python

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


vertex = [
    [ -1.0, -1.0, 1.0 ],
    [ 1.0, -1.0, 1.0 ],
    [ -1.0, 1.0, 1.0 ],
    [ 1.0, 1.0, 1.0 ],
    [ -1.0, 1.0, -1.0 ],
    [ 1.0, 1.0, -1.0 ],
    [ -1.0, -1.0, -1.0 ],
    [ 1.0, -1.0, -1.0 ]]

face = [
    [ 0, 1, 3, 2 ],
    [ 2, 3, 5, 4 ],
    [ 4, 5, 7, 6 ],
    [ 6, 7, 1, 0 ],
    [ 1, 7, 5, 3 ],
    [ 6, 0, 2, 4 ]]

color = [
    [ 1.0, 0.0, 0.0 ],
    [ 0.0, 1.0, 0.0 ],
    [ 0.0, 0.5, 0.5 ],
    [ 1.0, 1.0, 0.0 ],
    [ 1.0, 0.0, 1.0 ],
    [ 0.0, 1.0, 1.0 ]]

angleX = 0.0
angleY = 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 angleX, angleY

    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(angleX, 1.0, 0.0, 0.0);
    glRotated(angleY, 0.0, 1.0, 0.0);

    glBegin(GL_QUADS)
    for j in range(0, len(face)):
        glColor3dv(color[j])
        for i in range(0, 4):
            glVertex(vertex[face[j][i]])
    glEnd()

    glFlush()
    glutSwapBuffers()


def keyboard(key, x, y):
    global angleX, angleY
    if key=='q':
        sys.exit()
    elif key=='h':
        angleY += 1.0
        glutPostRedisplay()
    elif key=='j':
        angleX += 1.0
        glutPostRedisplay()

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

glClearColor(0.0, 0.0, 1.0, 0.0)
glEnable(GL_DEPTH_TEST)
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)

glutMainLoop()

スクリプト解説

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
デプスバッファを消去するために、引数に GL_DEPTH_BUFFER_BIT を入れておきます。
glBegin(GL_QUADS)
四角形を描きます。
glBegin()の引数は以下の定数を取ります。
GL_POINTS
頂点を描画
GL_LINES
線分を描画
GL_LINE_STRIP
線分を連結して描画
GL_LINE_LOOP
すべての頂点を線分で連結して描画
GL_TRIANGLES
三角形を描画
GL_TRIANGLE_STRIP
した三角形を連結して描画
GL_TRIANGLE_FAN
最初の頂点を軸に、連結した三角形を描画
GL_QUADS
四角形を描画
GL_QUAD_STRIP
四角形を連結して描画
GL_POLYGON
ポリゴンを描画する
glColor3dv(color[j])
フェースの色を指定します。
glColor(color[j]) でも同じです。
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
GLUT_DEPTH によって、デプスバッファを使う準備ができます。
glEnable(GL_DEPTH_TEST)
描画のときにデプスバッファを使います。
隠面消去処理に必要です。
デプスバッファを取り消すには、 glDisable(GL_DEPTH_TEST) を実行します。
glEnable(GL_CULL_FACE)
カリングを実行します。
取り消すには、 glDisable(GL_CULL_FACE) を実行します。
glCullFace(GL_BACK)
フェースの裏面を表示しないようにします。
表面を表示しないようにするには、 glCullFace(GL_FRONT) 表裏両面を表示しないようにするには、 glCullFace(GL_FRONT_AND_BACK) を実行します。

練習問題

  1. rwobj.pyを利用してOBJ ファイルを読み込んで隠面消去表示(フラットシェーディング)できるようにしてみましょう。(flat.py)
    表示色は適当なグレイスケールにしてください。

    上図のOBJデータ(sphere.obj)

    サッカーボールのOBJデータ(pSolid.obj)
    立方体のOBJデータ(cube.obj)

参考


Prev | Next
index | home
abetmhr@gmail.com