Table Of Contents

Previous topic

glut 基本編

Next topic

Framework

This Page

Basics

依存ライブラリ

install python

http://www.python.org/

Create window

glutの初期化とウィンドウ生成。

CreateWindow.py

#!/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ボタンをクリックして終了する。

このチュートリアルでは以下のコーディング規約を採用する。

  • indentはスペース4個
  • 一行は80文字

Draw Triangle

opengl/tutorial/glut/img/part1.png

前項で空だったdraw関数の中身を実装する。

DrawTriangle.py

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回で三角形ひとつですよという意味。

ResizeとViewport

WindowのResizeイベントのコールバック実装と、OpenGL描画領域(ビューポート)のサイズ指定。

Viewport.py

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。

  • 内部座標(-1, -1)〜(+1, +1)がビューポートで指定したピクセル座標にコピーされる。
  • 内部座標は、x軸は右が+、y軸は上が+

Mouseコールバック

視点操作を説明する前にマウスイベントの処理方法について。

Mouse.py

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ではホイールのイベントは取得できない(たぶん)。

Keyboardコールバック

ついでにキーボードイベント。

Keyboard.py

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’を押すと終了するようになった。

inserted by FC2 system