パソコン日記

気づいたこと まとめてみる

ライフゲームをPythonとOpenGLで作ってみる(OpenGLのインストール)

グラフィカルにライフゲーム

以前の記事でライフゲームPythonで作成しました。

1-compinfo.hatenablog.com

シミュレーションの結果はターミナル上に表示しましたが、 もっとグラフィカルに表示するために OpenGL を用いたいと思います。 そもそもOpenGLとはWikipediaによると OpenGL(Open Graphics Library)はクロノス・グループが策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスである。と書いてあります。 GUIのグラッフィクスのライブラリの一つですね。 今回はOpenGLライフゲームのプログラムで使うために、Python向けのOpenGLのインストールをしていきたいと思います。 Python向けのOpenGLライブラリはPyOpenGLというものです。 pipがインストールされていればインストールは簡単で次のコマンドでインストールできます。

  sudo pip install PyOpenGL

簡単ですね。 これからサンプルのプログラムを作ってみたいと思います。 参考にしたページ は「GLUTによる「手抜き」OpenGL入門」です

まず、ウィンドウを表示するプログラムです。 参考にしたwebページはC言語で書いてあったので、それをPythonで書き直しただけです。

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

def display():
    glClear(GL_COLOR_BUFFER_BIT) #ウィンドウの塗りつぶし。maskに塗りつぶすバッファの指定
    #GL_COLOR_BUFFER_BITでカラーバッファの塗りつぶし
    glFlush() #まだ実行されていないOpenGLの命令を実行

def init():
    glClearColor(0.0, 1.0, 0.0, 1.0) #glClear(GL_COLOR_BUFFER_BIT)でウィンドウを塗りつぶす際の色を指定

def main():
    glutInit(sys.argv) #GLUTおよびOpenGL環境の初期化
    glutInitDisplayMode(GLUT_RGBA) #ディスプレイの表示モード(RGBAモード)
    glutCreateWindow("test") #ウィンドウを開く
    glutDisplayFunc(display) #引数の関数を再描画のときに実行
    init()
    glutMainLoop() #プログラムのループ
    return 0

if __name__ == "__main__":
    main()

f:id:lxxv:20170722225149p:plain

コマンドの説明はコメントのとおりです。 次に線を引いてみます。

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

def display():
    glClear(GL_COLOR_BUFFER_BIT) #ウィンドウの塗りつぶし。maskに塗りつぶすバッファの指定
    #GL_COLOR_BUFFER_BITでカラーバッファの塗りつぶし
    glBegin(GL_LINE_LOOP) #描画する図形のタイプの指定
    glVertex2d(-0.9,-0.9) #2次元の座標値の設定
    glVertex2d(0.9,-0.9)
    glVertex2d(0.9,0.9)
    glVertex2d(-0.9,0.9)
    glEnd()
    glFlush() #まだ実行されていないOpenGLの命令を実行

def init():
    glClearColor(0.0, 1.0, 0.0, 1.0) #glClear(GL_COLOR_BUFFER_BIT)でウィンドウを塗りつぶす際の色を指定

def main():
    glutInit(sys.argv) #GLUTおよびOpenGL環境の初期化
    glutInitDisplayMode(GLUT_RGBA) #ディスプレイの表示モード(RGBAモード)
    glutCreateWindow("test") #ウィンドウを開く
    glutDisplayFunc(display) #引数の関数を再描画のときに実行
    init()
    glutMainLoop() #プログラムのループ
    return 0

if __name__ == "__main__":
    main()

f:id:lxxv:20170722225321p:plain

座標は中心が(0,0)になっているみたいですね。 このようにして、線を引く所までできました。