TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

PyOpenGLを使ってみる

前回の日記でPyOpenGLの導入を行った。

2D画像の変形をOpenGLを使って行うことが目標だが、現時点でOpenGLの知識がほとんどない。
画像の変形はFree-Form Deformationという方法でポリゴンの頂点を変形させることで実現できそうだが、あせらず基礎的なことから試していこうと思う。

ひとまず画面に豆腐(白い四角)を表示させてみる。

GLUTを使ったウィンドウを表示するだけのスケルトンプログラムは以下の通り記述する。

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)
    glFlush()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGB)
    glutInitWindowSize(300, 300)
    glutCreateWindow(b"skeleton")
    glutDisplayFunc(display)

    glutMainLoop()

if __name__ == '__main__':
    main()

これを元にコードを付け足していく。

白い四角を表示させる。

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)

    glColor3f(1.0, 1.0, 1.0) # 白色
    glBegin(GL_POLYGON)
    glVertex3f(0.5, 0.5, 0.0)
    glVertex3f(-0.5, 0.5, 0.0)
    glVertex3f(-0.5, -0.5, 0.0)
    glVertex3f(0.5, -0.5, 0.0)
    glEnd()

    glFlush()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGB)
    glutInitWindowSize(300, 300)
    glutCreateWindow(b"sample1")
    glutDisplayFunc(display)

    glutMainLoop()

if __name__ == '__main__':
    main()

四角が表示される。
f:id:TadaoYamaoka:20170302221859p:plain

投影法

上記のコードでは投影法について指定していないが、デフォルトで平行投影となる。
mainに以下のコードを書いても同じである。

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)

glOrthoのOrthoは、Orthogonal projection(平行投影、直交射影)の略である。
指定した直方体(ビューボリューム)の中にある物体をそのままの大きさでスクリーンに投影する。

なお、glMatrixMode(GL_PROJECTION)は、投影変換の行列スタックを選択し、glLoadIdentity()でスタックをクリアして、glOrthoで新たな投影変換の行列を設定している。

座標系

頂点の座標を指定する際は、座標系を理解しておく必要がある。
他の解説サイトがあるので、リンクを張っておく。

http://www.arakin.dyndns.org/gl_coord.php

DirectXとは座標系が異なるので注意が必要である。
面は頂点が反時計回りになるように定義する。