OpenGLは、CGの基礎を学ぶのに適したライブラリです。もちろん、基礎を学ぶだけでなく、研究や、商用利用など幅広く応用されています。(詳しくはwikiなどへ)
より直接的には、プログラムを動かした結果をきれいに表示できるだけで、作った感が出るだけでなく、ユーザに使ってもらえたり、視覚的に伝わるので、その効果が想像してもらいやすくなります。結果的に、モチベーションにも繋がりやすい部分です。今回は、そんなOpenGLをPythonで実行して試す環境を構築します。
Pythonの準備
まずは、以前に投稿した、こちらの記事を参考にPythonの開発環境を用意してください。
conda create -n py36_opengl python=3.6 anaconda
などとして環境を用意します。
「PyOpenGL」をインストール
続けて、PyOpenGLをインストールします。
pip install PyOpenGL PyOpenGL_accelerate
念の為ですが、PyOpenGL は、OpenGLのPythonバインディングです。バインディングは「ctypes」ライブラリを使って作成されています。ライセンスもBSDです。(本稿執筆時点)詳しくはこちらへ
freeglutをインストール
続けて、Windowsでは、glutをインストールします。
今回はメンテされているfreeglutにします。
自前でビルドしたい方は、こちらを参考に。ビルドしたくない方は、こちらから 「Download freeglut 3.0.0 for MSVC」のリンクをクリックしてダウンロードしましょう。
freeglut\bin\x64を解凍して、C:\Windows\System32にコピーします。
freeglutを読み込めるように、下記のパスのファイルを開き、 ‘freeglut’, を追加。
C:\Users\UserName\Anaconda3\envs\py36_opengl\Lib\site-packages\OpenGL\platform\win32.py
これで準備は完了です!
動作確認
以下で紹介するサンプルを実行するか、その下のDemoを試してみます。
サンプルコード
import sys
from OpenGL.GLUT import *
from OpenGL.GL import *
from OpenGL.GLU import *
def display():
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1.0, 1.0, 1.0)
glBegin(GL_POLYGON)
glVertex3f(0.25, 0.25, 0.0)
glVertex3f(0.75, 0.25, 0.0)
glVertex3f(0.75, 0.75, 0.0)
glEnd()
glFlush()
def init():
glClearColor(0.0, 0.0, 0.0, 0.0)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0)
glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(300, 300)
glutInitWindowPosition(200, 200)
glutCreateWindow(b"hello")
init()
glutDisplayFunc(display)
glutMainLoop()
Demoを動かす
pip install PyOpenGL-Demo
インストールが無事に完了すると下記のディレクトリにインストールされます。UserNameは置き換えてください。
C:\Users\UserName\Anaconda3\envs\py36_opengl\Lib\site-packages\PyOpenGL-Demo
redbook のディレクトリに入り、hello.pyを実行します。
cd redbook
python hello.py
Python3向けにprintを修正して実行すると、下記のようなエラーが表示されることがありますが、 glutが正しく初期化できていないようです。環境にglutが正しく配置されているか確認してみましょう。
OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before calling
また実行時に、下記のようにエラーが出たときは、
Traceback (most recent call last):
File "hello.py", line 101, in <module>
glutCreateWindow("hello")
File "C:\Users\UserName\Anaconda3\envs\py36_opengl\lib\site-packages\OpenGL\GLUT\special.py", line 73, in glutCreateWindow
return __glutCreateWindowWithExit(title, _exitfunc)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
以下のようにbを付け加えて実行し直してみてください。
glutCreateWindow(b"hello")
redbook以外にも、NeHeなどもあるので、動かしてみましょう!