環境構築
概要
詳しくはlesson1.pyのコメントを読んでください。一部重要そうな部分を翻訳してまとめます。lesson2.py以降も概要とメモは同じことが書いてあるようです。(追記 lesson4.pyで、PyNumericの表記が変わり、NumPyになっていました。またNumPyについて、効率的な多次元配列型と線形代数ライブラリを提供しているため、パフォーマンスに影響があるかもしれないことなどが指摘されていました)
Tarn Weisner Burton氏によるPyOpenGL 2.0へ移植(2001年5月10日)
コードはRichard Campbell ’99によって作成された(2000年にJohn FergusonによってPython/PyOpenGLに移植された)
オリジナルのソースと C ベースのチュートリアルはこちらを参照。
PyOpenGLパッケージを使ってPythonでOpen GL APIを使う方法を説明している。 GLUTも使用している。このライブラリを使用して書くコードは関数ベースのプログラミングを使用したCプログラムに近いものになる。
main関数を確認する
def main():
global window # ウィンドウIDの保持用
# initに引数を渡す
glutInit(sys.argv)
# 表示モードの種類を選択
# Double buffer, RGBA color, アルファコンポーネント対応 Depth buffer
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
# ウィンドウを初期化
glutInitWindowSize(640, 480)
# ウィンドウの座標の初期化、画面の左上隅
glutInitWindowPosition(0, 0)
# 閉じるときに使用するウィンドウIDを保持
window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99".encode("cp932"))
# glutで描画関数を登録
glutDisplayFunc(DrawGLScene)
# この行のコメントを外すとフルスクリーンになる
#glutFullScreen()
# 何もしていないとき、シーンの再描画
glutIdleFunc(DrawGLScene)
# ウィンドウのサイズ変更時に呼び出される関数を登録
glutReshapeFunc(ReSizeGLScene)
# キーボードが押されたときに呼び出される関数を登録
glutKeyboardFunc(keyPressed)
# GLの初期化
InitGL(640, 480)
# MainLoopを実行
glutMainLoop()
描画関数
# メインの描画関数
def DrawGLScene():
# 画面とデプスバッファのクリア
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
# ビューのリセット
glLoadIdentity()
# 二重にバッファリングしているため、バッファを入れ替えて描画されたものを表示する
glutSwapBuffers()
ウィンドウのサイズ変更時に呼び出される関数
# ウィンドウのサイズが変更されたときに呼び出される関数 (フルスクリーン有効時は使用されないはず)
def ReSizeGLScene(Width, Height):
if Height == 0: # ウィンドウが小さすぎる場合、ゼロによる除算を防ぐ
Height = 1
glViewport(0, 0, Width, Height) # 現在のビューポートとパースペクティブの変換をリセット
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)
キーが押されたときに呼び出される関数
# キーボードが押されたときに呼び出される関数
def keyPressed(*args):
global window
# ESCを押したときに終了
if args[0] == ESCAPE:
sys.exit()
GLの初期化関数
# 一般的なOpenGL初期化関数。 すべての初期パラメータを設定する。
def InitGL(Width, Height): # OpenGLウィンドウが作成された直後にこれを呼び出す
glClearColor(0.0, 0.0, 0.0, 0.0) # 背景色を黒でクリア
glClearDepth(1.0) # デプスバッファのクリアを有効に
glDepthFunc(GL_LESS) # 行うべきDepth Testの種類
glEnable(GL_DEPTH_TEST) # Depth Testを可能に
glShadeModel(GL_SMOOTH) # スムーズなカラーシェーディングを有効に
glMatrixMode(GL_PROJECTION)
glLoadIdentity() # 投影マトリックスのリセット
# ウィンドウのアスペクト比を計算
gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)