TadaoYamaokaの開発日記

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

PyOpenGLを使ってみる その4(頂点配列)

頂点配列を使って描画を行う。

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

def display():
    glClear(GL_COLOR_BUFFER_BIT)

    glEnableClientState(GL_VERTEX_ARRAY)

    glColor3f(1.0, 0.0, 0.0)
    glVertexPointerf([
        ( 0.0,  1.0, 0.0),
        (-0.5,  0.0, 0.0),
        ( 0.5,  0.0, 0.0),
        ])
    glDrawArrays(GL_TRIANGLES, 0, 3)

    glColor3f(0.0, 1.0, 0.0)
    glVertexPointerf([
        (-0.5,  0.0, 0.0),
        (-0.5, -1.0, 0.0),
        ( 0.5,  0.0, 0.0),
        ( 0.5, -1.0, 0.0),
        ])
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)

    glFlush()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA)
    glutInitWindowSize(300, 300)
    glutCreateWindow(b"sample2")
    glutDisplayFunc(display)
    glClearColor(0.0, 0.0, 1.0, 1.0)

    glutMainLoop()

if __name__ == '__main__':
    main()
解説

頂点配列を使用するには、

    glEnableClientState(GL_VERTEX_ARRAY)

で、頂点配列を有効にする。

次に、頂点配列を定義する。PyOpenGLでは、glVertexPointerfを使うことで、頂点のタプルのリストをPythonの組み込み型のまま直接使用できる。
上記の例では、三角形の頂点を

    glVertexPointerf([
        ( 0.0,  1.0, 0.0),
        (-0.5,  0.0, 0.0),
        ( 0.5,  0.0, 0.0),
        ])

で定義している。

次に、定義した頂点配列を使用して、glDrawArraysで三角形を描画する。引数にGL_TRIANGLESを指定することで三角形の描画になる。

GL_TRIANGLES以外にもいくつか描画方法がある。詳しくは、マニュアルを参照。

GL_TRIANGLE_STRIP

GL_TRIANGLE_STRIPを使用すると四角形を描画することができる。
4つの頂点を定義して、頂点番号(0, 1, 2)と(1, 2, 3)の2つの三角形を描画する。
上記の例では、

    glVertexPointerf([
        (-0.5,  0.0, 0.0),
        (-0.5, -1.0, 0.0),
        ( 0.5,  0.0, 0.0),
        ( 0.5, -1.0, 0.0),
        ])

で、4つの頂点を定義して、

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)

で、GL_TRIANGLE_STRIPを使用して四角を描画している。

実行結果

f:id:TadaoYamaoka:20170305124717p:plain