3DCG

Python3で「OpenGL」を学ぶ 「PyOpenGL」NeHe Lesson1

環境構築

概要

詳しくは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)