glutの初期化とウィンドウ生成。
#!/usr/bin/python
# coding: utf-8
from OpenGL.GL import *
from OpenGL.GLUT import *
def draw():
# OpenGLバッファのクリア
glClearColor(0.0, 0.5, 0.5, 0.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# OpenGL描画実行
glFlush()
# glutダブルバッファ交換
glutSwapBuffers()
def setup():
glutInit(sys.argv)
# RGBAモード、ダブルバッファリング有効、Zバッファ有効で初期化
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutCreateWindow("glut sample")
# 描画時に呼ばれる関数を登録
glutDisplayFunc(draw)
if __name__=="__main__":
setup()
glutMainLoop()
中身の無いWindowが表示されればOK。 xボタンをクリックして終了する。
このチュートリアルでは以下のコーディング規約を採用する。
前項で空だったdraw関数の中身を実装する。
def draw():
# OpenGLバッファのクリア
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()
# OpenGL描画実行
glFlush()
# glutダブルバッファ交換
glutSwapBuffers()
def setup():
glutInit(sys.argv)
# RGBAモード、ダブルバッファリング有効、Zバッファ有効で初期化
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutCreateWindow("glut sample")
# 描画時に呼ばれる関数を登録
glutDisplayFunc(draw)
白い三角形が表示されればOK。 OpenGLでは初期状態では、ウィンドウの左下が(-1, -1)で右上が(1, 1)の座標を持っている。デフォルトの背景は黒、描画色は白となっている。
glBegin〜glEndの間にglVertexを呼び出すことで点を打つことができる。複数の点がどうのような関係になるかをglBeginの引数GL_TRIANGLESで指定している。GL_TRIANGLESの意味は、glVertex3回で三角形ひとつですよという意味。
WindowのResizeイベントのコールバック実装と、OpenGL描画領域(ビューポート)のサイズ指定。
def resize(w, h):
print("resize", w, h)
# Windowの左から100, 下から100, 幅w/2, 高さh/2をビューポートにする
glViewport(50, 150, w/2, h/2)
def setup():
glutInit(sys.argv)
# RGBAモード、ダブルバッファリング有効、Zバッファ有効で初期化
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutCreateWindow("glut sample")
# Windowのサイズが変わった時に呼ばれる関数を登録
glutReshapeFunc(resize)
# 描画時に呼ばれる関数を登録
glutDisplayFunc(draw)
ウインドウの拡大・縮小に三角形が伸び縮みすればOK。
視点操作を説明する前にマウスイベントの処理方法について。
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",
else:
print "unknown button:", button,
if state==GLUT_DOWN:
print "down",
elif state==GLUT_UP:
print "up",
else:
print "unknown state:", state,
print(x, y)
def motion(x, y):
print "motion:", x, y
def setup():
glutInit(sys.argv)
# RGBAモード、ダブルバッファリング有効、Zバッファ有効で初期化
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutCreateWindow("glut sample")
# Windowのサイズが変わった時に呼ばれる関数を登録
glutReshapeFunc(resize)
# 描画時に呼ばれる関数を登録
glutDisplayFunc(draw)
# マウスボタン押し上げ時に呼ばれる関数
glutMouseFunc(mouse)
# マウスドラッグ時に呼ばれる関数
glutMotionFunc(motion)
ボタンのクリック、ポインタの移動を受け取ってprintする。 素のglutではホイールのイベントは取得できない(たぶん)。
ついでにキーボードイベント。
def keyboard(key, x, y):
if key=='\033': # Escape
sys.exit()
elif key=='q':
sys.exit()
else:
print(key)
def setup():
glutInit(sys.argv)
# RGBAモード、ダブルバッファリング有効、Zバッファ有効で初期化
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
glutInitWindowSize(640, 480)
glutCreateWindow("glut sample")
# Windowのサイズが変わった時に呼ばれる関数を登録
glutReshapeFunc(resize)
# 描画時に呼ばれる関数を登録
glutDisplayFunc(draw)
# マウスボタン押し上げ時に呼ばれる関数
glutMouseFunc(mouse)
# マウスドラッグ時に呼ばれる関数
glutMotionFunc(motion)
# キーボードが押された時に呼ばれる関数
glutKeyboardFunc(keyboard)
ESCまたは’q’を押すと終了するようになった。