なぜかOpenGLを学び始める

GLUT を用いた OpenGLチュートリアルです

Pythonで書き換え中。

4.1空のウィンドウを開く

#!/usr/bin/python
# -*- coding: utf-8 -*-

from OpenGL.GLUT import *

def display():
    pass

glutInit()
glutCreateWindow('')
glutDisplayFunc(display)
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-1.py

4.2ウィンドウを塗りつぶす

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glFlush()
def init():
    glClearColor(0.0,0.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-2.py
注意点はglutCreateWindow('')をglutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)より先に持ってこないとseg faultするところ。

5.1線を引く

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glBegin(GL_LINE_LOOP);
    glVertex2d(-0.9, -0.9);
    glVertex2d(0.9, -0.9);
    glVertex2d(0.9, 0.9);
    glVertex2d(-0.9, 0.9);
    glEnd();
    glFlush()
def init():
    glClearColor(0.0,0.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-3.py

5.3線に色をつける

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3d(1.0, 0.0, 0.0);
    glBegin(GL_LINE_LOOP);
    glVertex2d(-0.9, -0.9);
    glVertex2d(0.9, -0.9);
    glVertex2d(0.9, 0.9);
    glVertex2d(-0.9, 0.9);
    glEnd();
    glFlush()
def init():
    glClearColor(0.0,0.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-4.py

5.4図形を塗りつぶす

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3d(1.0, 0.0, 0.0);
    glBegin(GL_POLYGON);
    glVertex2d(-0.9, -0.9);
    glVertex2d(0.9, -0.9);
    glVertex2d(0.9, 0.9);
    glVertex2d(-0.9, 0.9);
    glEnd();
    glFlush()
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-5.py

図形を塗りつぶすの続き

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glBegin(GL_POLYGON);
    glColor3d(1.0, 0.0, 0.0);
    glVertex2d(-0.9, -0.9);
    glColor3d(0.0, 1.0, 0.0);
    glVertex2d(0.9, -0.9);
    glColor3d(0.0, 0.0, 1.0);
    glVertex2d(0.9, 0.9);
    glColor3d(1.0, 1.0, 0.0);
    glVertex2d(-0.9, 0.9);
    glEnd();
    glFlush()
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-6.py

6.1座標軸とビューポート

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glBegin(GL_POLYGON);
    glColor3d(1.0, 0.0, 0.0);
    glVertex2d(-0.9, -0.9);
    glColor3d(0.0, 1.0, 0.0);
    glVertex2d(0.9, -0.9);
    glColor3d(0.0, 0.0, 1.0);
    glVertex2d(0.9, 0.9);
    glColor3d(1.0, 1.0, 0.0);
    glVertex2d(-0.9, 0.9);
    glEnd();
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    glOrtho(-w/200.0,w/200.0,-h/200.0,h/200.0,-1.0,1.0)
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-7.py

6.2位置やサイズを指定してウィンドウを開く

動かなかったからパス。…もしかするとglutInitDisplayModeも動いていないのかも。

7.1マウスボタンをクリックする

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
def mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        print('left')
    elif button==GLUT_MIDDLE_BUTTON:
        print('middle')
    elif button==GLUT_RIGHT_BUTTON:
        print('right')
    print(' button is ')
    if state==GLUT_UP:
        print('up')
    elif state==GLUT_DOWN:
        print('down')
    print(' at (%d,%d)'%(x,y))
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
#glutInitWindowPosition(100,100)
#glutInitWindowSize(320,240)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-9.py

7.1マウスボタンをクリックするの続き

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    glOrtho(-0.5,w-0.5,h-0.5,-0.5,-1.0,1.0)
class staticData:
    x0 = 0
    y0 = 0
def mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_UP:
            glColor3d(0.0,0.0,0.0)
            glBegin(GL_LINES)
            glVertex2i(staticData.x0,staticData.y0)
            glVertex2i(x,y)
            glEnd()
            glFlush()
        else:
            staticData.x0 = x
            staticData.y0 = y
    elif button==GLUT_MIDDLE_BUTTON:
        pass
    elif button==GLUT_RIGHT_BUTTON:
        pass

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
#glutInitWindowPosition(100,100)
#glutInitWindowSize(320,240)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-10.py
なんかstatic変数をそのままグローバル変数にすると動かなかったのでちょっと不思議な構成になってる

7.1マウスボタンをクリックするのさらにつづき

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    points = []

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    if len(staticData.points)>1:
        glColor3d(0.0,0.0,0.0)
        glBegin(GL_LINES)
        for i in range(staticData.points):
            glVertex2iv(staticData.points[i])
        glEnd()
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    glOrtho(-0.5,w-0.5,h-0.5,-0.5,-1.0,1.0)
def mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        staticData.points.append((x,y))
        if state==GLUT_UP:
            glColor3d(0.0,0.0,0.0)
            glBegin(GL_LINES)
            glVertex2iv(staticData.points[-2:-1])
            glVertex2iv(staticData.points[-1:])
            glEnd()
            glFlush()
    elif button==GLUT_MIDDLE_BUTTON:
        pass
    elif button==GLUT_RIGHT_BUTTON:
        pass

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
#glutInitWindowPosition(100,100)
#glutInitWindowSize(320,240)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-11.py
マウス位置の確保にはタプルを突っ込んでみました。なんとか動く模様

7.2マウスをドラッグする

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    points = []
    rubberband = 0
    savepoint = ()

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    if len(staticData.points)>1:
        glColor3d(0.0,0.0,0.0)
        glBegin(GL_LINES)
        for i in range(staticData.points):
            glVertex2iv(staticData.points[i])
        glEnd()
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    glOrtho(-0.5,w-0.5,h-0.5,-0.5,-1.0,1.0)
def mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        staticData.points.append((x,y))
        if state==GLUT_UP:
            glColor3d(0.0,0.0,0.0)
            glBegin(GL_LINES)
            glVertex2iv(staticData.points[-2:-1])
            glVertex2iv(staticData.points[-1:])
            glEnd()
            glFlush()
            rubberband = 0
    elif button==GLUT_MIDDLE_BUTTON:
        pass
    elif button==GLUT_RIGHT_BUTTON:
        pass
def motion(x,y):
    glEnable(GL_COLOR_LOGIC_OP)
    glLogicOp(GL_INVERT)
    glBegin(GL_LINES)
    if staticData.rubberband:
        glVertex2iv(staticData.points[-1:])
        glVertex2iv(staticData.savepoint)
    glVertex2iv(staticData.points[-1:])
    glVertex2i(x,y)
    glEnd()
    glFlush()
    glLogicOp(GL_COPY)
    glDisable(GL_COLOR_LOGIC_OP)
    staticData.savepoint = (x,y)
    staticData.rubberband = 1

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
#glutInitWindowPosition(100,100)
#glutInitWindowSize(320,240)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutMotionFunc(motion)
init()
glutMainLoop()

…なにか間違ってる気がしないでもないけれども続けよう
http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-12.py

7.3キーボードから読み込む

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    points = []
    rubberband = 0
    savepoint = ()

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    if len(staticData.points)>1:
        glColor3d(0.0,0.0,0.0)
        glBegin(GL_LINES)
        for i in range(staticData.points):
            glVertex2iv(staticData.points[i])
        glEnd()
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    glOrtho(-0.5,w-0.5,h-0.5,-0.5,-1.0,1.0)
def mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        staticData.points.append((x,y))
        if state==GLUT_UP:
            glColor3d(0.0,0.0,0.0)
            glBegin(GL_LINES)
            glVertex2iv(staticData.points[-2:-1])
            glVertex2iv(staticData.points[-1:])
            glEnd()
            glFlush()
            rubberband = 0
    elif button==GLUT_MIDDLE_BUTTON:
        pass
    elif button==GLUT_RIGHT_BUTTON:
        pass
def motion(x,y):
    glEnable(GL_COLOR_LOGIC_OP)
    glLogicOp(GL_INVERT)
    glBegin(GL_LINES)
    if staticData.rubberband:
        glVertex2iv(staticData.points[-1:])
        glVertex2iv(staticData.savepoint)
    glVertex2iv(staticData.points[-1:])
    glVertex2i(x,y)
    glEnd()
    glFlush()
    glLogicOp(GL_COPY)
    glDisable(GL_COLOR_LOGIC_OP)
    staticData.savepoint = (x,y)
    staticData.rubberband = 1
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
#glutInitWindowPosition(100,100)
#glutInitWindowSize(320,240)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
glutMotionFunc(motion)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog1-13.py

8.1二次元と三次元

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glRotated(25.0,0.0,1.0,0.0)
    glBegin(GL_POLYGON);
    glColor3d(1.0, 0.0, 0.0);
    glVertex2d(-0.9, -0.9);
    glColor3d(0.0, 1.0, 0.0);
    glVertex2d(0.9, -0.9);
    glColor3d(0.0, 0.0, 1.0);
    glVertex2d(0.9, 0.9);
    glColor3d(1.0, 1.0, 0.0);
    glVertex2d(-0.9, 0.9);
    glEnd();
    glFlush()
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
init()
glutMainLoop()

…微妙だなあ。あってるのかなあ。
http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-2.py

8.3線画を表示する

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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 display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_LINES)
    for i in range(12):
        glVertex3dv(staticData.vertex[staticData.edge[i][0]])
        glVertex3dv(staticData.vertex[staticData.edge[i][1]])
    glEnd();
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    glOrtho(-2.0,2.0,-2.0,2.0,-2.0,2.0)
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-3.py
立体には見えない…んだけどこれでいいらしい。

8.3透視投影する

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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 display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_LINES)
    for i in range(12):
        glVertex3dv(staticData.vertex[staticData.edge[i][0]])
        glVertex3dv(staticData.vertex[staticData.edge[i][1]])
    glEnd();
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    gluPerspective(30.0,w/h,1.0,100.0)
    glTranslated(0.0,0.0,-5.0)
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-4.py
ほんとーにあってるのか。
C言語版をひとさらいしておくべきだったか。

8.4視点の位置を変更する

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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 display():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_LINES)
    for i in range(12):
        glVertex3dv(staticData.vertex[staticData.edge[i][0]])
        glVertex3dv(staticData.vertex[staticData.edge[i][1]])
    glEnd();
    glFlush()
def resize(w,h):
    glViewport(0,0,w,h)
    glLoadIdentity()
    gluPerspective(30.0,w/h,1.0,100.0)
    gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)
def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-5.py
おー。なんか立体的に見えてきた。

9.1図形を回転させる

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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]
        ]
    r = 0

def idle():
    glutPostRedisplay()

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)
    glRotated(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_LINES)
    for i in range(12):
        glVertex3dv(staticData.vertex[staticData.edge[i][0]])
        glVertex3dv(staticData.vertex[staticData.edge[i][1]])
    glEnd();
    glFlush()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-6.py
おー。まわるまわる。

9.2ダブルバッファリング

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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]
        ]
    r = 0

def idle():
    glutPostRedisplay()

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)
    glRotated(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_LINES)
    for i in range(12):
        glVertex3dv(staticData.vertex[staticData.edge[i][0]])
        glVertex3dv(staticData.vertex[staticData.edge[i][1]])
    glEnd();
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-7.py
…正直、前のバージョンでもちらついていなかったのでよくわからないダブルバッファリング。

10.1多面体を塗りつぶす

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0

def idle():
    glutPostRedisplay()

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()
    gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)
    glRotated(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_QUADS)
    for j in range(6):
        glColor3dv(staticData.color[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-8.py
色をつけるところまで。

デプスバッファを使用する

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0

def idle():
    glutPostRedisplay()

def display():
    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(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_QUADS)
    for j in range(6):
        glColor3dv(staticData.color[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)
    glEnable(GL_DEPTH_TEST)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-9.py

10.3カリング

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0

def idle():
    glutPostRedisplay()

def display():
    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(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_QUADS)
    for j in range(6):
        glColor3dv(staticData.color[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_BACK)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-10.py
なんか変な表示になるけどそれでいいらしい

11.1光をあててみる

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0
    normal = [
        [ 0.0, 0.0,-1.0 ],
        [ 1.0, 0.0, 0.0 ],
        [ 0.0, 0.0, 1.0 ],
        [-1.0, 0.0, 0.0 ],
        [ 0.0,-1.0, 0.0 ],
        [ 0.0, 1.0, 0.0 ]
        ]

def idle():
    glutPostRedisplay()

def display():
    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(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_QUADS)
    for j in range(6):
        glNormal3dv(staticData.normal[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_FRONT)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-11.py
モノクロだけど。

11.2光源を設定する

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0
    normal = [
        [ 0.0, 0.0,-1.0 ],
        [ 1.0, 0.0, 0.0 ],
        [ 0.0, 0.0, 1.0 ],
        [-1.0, 0.0, 0.0 ],
        [ 0.0,-1.0, 0.0 ],
        [ 0.0, 1.0, 0.0 ]
        ]
    light0pos = [0.0, 3.0, 5.0, 1.0]
    light1pos = [5.0, 3.0, 0.0, 1.0]
    green = [0.0, 1.0, 0.0, 1.0]

def idle():
    glutPostRedisplay()

def display():
    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)
    glLightfv(GL_LIGHT0, GL_POSITION, staticData.light0pos)
    glLightfv(GL_LIGHT1, GL_POSITION, staticData.light1pos)
    glRotated(staticData.r,0.0,1.0,0.0)
    glColor3d(0.0,0.0,0.0)
    glBegin(GL_QUADS)
    for j in range(6):
        glNormal3dv(staticData.normal[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_FRONT)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_LIGHT1)
    glLightfv(GL_LIGHT1, GL_DIFFUSE, staticData.green)
    glLightfv(GL_LIGHT1, GL_SPECULAR, staticData.green)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-12.py
緑色。

11.3材質を設定する

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0
    normal = [
        [ 0.0, 0.0,-1.0 ],
        [ 1.0, 0.0, 0.0 ],
        [ 0.0, 0.0, 1.0 ],
        [-1.0, 0.0, 0.0 ],
        [ 0.0,-1.0, 0.0 ],
        [ 0.0, 1.0, 0.0 ]
        ]
    light0pos = [0.0, 3.0, 5.0, 1.0]
    light1pos = [5.0, 3.0, 0.0, 1.0]
    green = [0.0, 1.0, 0.0, 1.0]
    red = [0.8, 0.2, 0.2, 1.0]

def idle():
    glutPostRedisplay()

def display():
    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)
    glLightfv(GL_LIGHT0, GL_POSITION, staticData.light0pos)
    glLightfv(GL_LIGHT1, GL_POSITION, staticData.light1pos)
    glRotated(staticData.r,0.0,1.0,0.0)
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,staticData.red)
    glBegin(GL_QUADS)
    for j in range(6):
        glNormal3dv(staticData.normal[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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 mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_FRONT)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_LIGHT1)
    glLightfv(GL_LIGHT1, GL_DIFFUSE, staticData.green)
    glLightfv(GL_LIGHT1, GL_SPECULAR, staticData.green)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-13.py
赤緑。だんだんコメントが適当になってきた。…画像もうpするべきかもー。

階層構造

#!/usr/bin/python
# -*- coding: utf-8 -*-

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

class staticData:
    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)
        ]
    face = [
        [0,1,2,3],
        [1,5,6,2],
        [5,4,7,6],
        [4,0,3,7],
        [4,5,1,0],
        [3,2,6,7]
        ]
    color = [
        [1.0,0.0,0.0],
        [0.0,1.0,0.0],
        [0.0,0.0,1.0],
        [1.0,1.0,0.0],
        [1.0,0.0,1.0],
        [0.0,1.0,1.0]
        ]
    r = 0
    normal = [
        [ 0.0, 0.0,-1.0 ],
        [ 1.0, 0.0, 0.0 ],
        [ 0.0, 0.0, 1.0 ],
        [-1.0, 0.0, 0.0 ],
        [ 0.0,-1.0, 0.0 ],
        [ 0.0, 1.0, 0.0 ]
        ]
    light0pos = [0.0, 3.0, 5.0, 1.0]
    light1pos = [5.0, 3.0, 0.0, 1.0]
    green = [0.0, 1.0, 0.0, 1.0]
    red = [0.8, 0.2, 0.2, 1.0]
    blue = [0.2,0.2,0.8,1.0]

def cube():
    glBegin(GL_QUADS)
    for j in range(6):
        glNormal3dv(staticData.normal[j])
        for i in range(4):
            glVertex3dv(staticData.vertex[staticData.face[j][i]])
    glEnd()

def idle():
    glutPostRedisplay()

def display():
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glLightfv(GL_LIGHT0, GL_POSITION, staticData.light0pos)
    glLightfv(GL_LIGHT1, GL_POSITION, staticData.light1pos)
    glPushMatrix()
    glRotated(staticData.r,0.0,1.0,0.0)
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE,staticData.red)
    cube()
    glPushMatrix()
    glTranslated(1.0,1.0,1.0)
    glRotated(2*staticData.r,0.0,1.0,0.0)
    glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,staticData.blue)
    cube()
    glPopMatrix()
    glPopMatrix()
    glutSwapBuffers()
    staticData.r = staticData.r+1
    if staticData.r>=360: staticData.r = 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)
    glLoadIdentity()
    gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)
def mouse(button,state,x,y):
    if button==GLUT_LEFT_BUTTON:
        if state==GLUT_DOWN:
            glutIdleFunc(idle)
        else:
            glutIdleFunc(0)
    elif button==GLUT_RIGHT_BUTTON:
        if state==GLUT_DOWN:
            glutPostRedisplay()
def keyboard(key,x,y):
    if key=='q' or key=='Q' or key=='\033':
        exit()

def init():
    glClearColor(1.0,1.0,1.0,1.0)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glCullFace(GL_FRONT)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_LIGHT1)
    glLightfv(GL_LIGHT1, GL_DIFFUSE, staticData.green)
    glLightfv(GL_LIGHT1, GL_SPECULAR, staticData.green)

glutInit(sys.argv)
glutCreateWindow('')
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH)
glutDisplayFunc(display)
glutReshapeFunc(resize)
glutMouseFunc(mouse)
glutKeyboardFunc(keyboard)
init()
glutMainLoop()

http://dl.dropbox.com/u/228440/veleno-samples/python-samples/pyOpenGL/prog2-14.py
とりあえず実験の手前まで。