3DCG

Pythonで「OpenGL」を学ぶ 「PyOpenGL」「freeglut」の環境構築

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などもあるので、動かしてみましょう!