2021/09/30(木) [n年前の日記]
#1 [python] Pygame + PyOpenGL で teapot が描画できない
Python + 2Dゲーム制作ライブラリ Pygame の復習を兼ねて、昔書いたスクリプトを動かして確認していたのだけど。Pyagme + 3D描画ライブラリ PyOpenGL を使ったスクリプト上で teapot の描画ができない ―― glutWireTeapot() や glutSolidTeapot() がエラーを出すことに気づいた。
環境は、Windows10 x64 21H1 + Python 3.9.5 x64 + pygame 2.0.1 + PyOpenGL 3.1.5 + PyOpenGL-accelerate 3.1.5。
動かなかったスクリプトは以下。
_01_teapot_on_pygame.py
以下のようなエラーメッセージが出る。
ちなみに、昔のバージョン、Python 2.7.18 x86 + pygame 2.0.1 + PyOpenGL 3.1.0 + PyOpenGL-accelerate 3.1.0 なら、ちゃんと動く。ウインドウ内に teapot が表示される。
解決方法は今のところ不明。
環境は、Windows10 x64 21H1 + Python 3.9.5 x64 + pygame 2.0.1 + PyOpenGL 3.1.5 + PyOpenGL-accelerate 3.1.5。
> python -VV Python 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] > pip list | grep -e pygame -e PyOpenGL pygame 2.0.1 PyOpenGL 3.1.5 PyOpenGL-accelerate 3.1.5
動かなかったスクリプトは以下。
_01_teapot_on_pygame.py
以下のようなエラーメッセージが出る。
> python 01_teapot_on_pygame.py pygame 2.0.1 (SDL 2.0.14, Python 3.9.5) Hello from the pygame community. https://www.pygame.org/contribute.html Traceback (most recent call last): File "D:\home\prg\python\_test_sample\pygame_opengl\01_teapot_on_pygame.py", line 102, in <module> glutWireTeapot(1.0) # wireframe OSError: exception: access violation reading 0x0000000000000034
ちなみに、昔のバージョン、Python 2.7.18 x86 + pygame 2.0.1 + PyOpenGL 3.1.0 + PyOpenGL-accelerate 3.1.0 なら、ちゃんと動く。ウインドウ内に teapot が表示される。
> python -V Python 2.7.18 > pip list | grep -e pygame -e PyOpenGL pygame 2.0.1 PyOpenGL 3.1.0 PyOpenGL-accelerate 3.1.0
解決方法は今のところ不明。
◎ PyOpenGLのインストールについて。 :
Windows上で PyOpenGL を使おうとして、pip でネット経由のインストールを ―― pip install PyOpenGL でインストールしたら、GLUT関連が動かなくてハマった。別途 glut*.dll 等が必要になると思うのだけど、どの版を入手して、どこに置けばいいのやら。
以下のサイトから非公式版の .whl を入手してインストールすれば、すんなり動いてくれる。
_Python Extension Packages for Windows - Christoph Gohlke
今回、Python 3.9.5 x64上で使いたかったので、以下をDLしてインストールした。
ちなみに、Python 3.9.xインストールフォルダ\Lib\site-packages\OpenGL\DLLS\ 以下に、freeglut64.vc15.dll、gle64.vc15.dll、glut64.vc15.dll が入っている模様。
Python 2.7.18 上では、以下を実行してインストールした。
_pyopengl_310_win32_py27_setup.zip
以下のサイトから非公式版の .whl を入手してインストールすれば、すんなり動いてくれる。
_Python Extension Packages for Windows - Christoph Gohlke
今回、Python 3.9.5 x64上で使いたかったので、以下をDLしてインストールした。
- PyOpenGL-3.1.5-cp39-cp39-win_amd64.whl
- PyOpenGL_accelerate-3.1.5-cp39-cp39-win_amd64.whl
pip install PyOpenGL-3.1.5-cp39-cp39-win_amd64.whl pip install PyOpenGL_accelerate-3.1.5-cp39-cp39-win_amd64.whl
ちなみに、Python 3.9.xインストールフォルダ\Lib\site-packages\OpenGL\DLLS\ 以下に、freeglut64.vc15.dll、gle64.vc15.dll、glut64.vc15.dll が入っている模様。
Python 2.7.18 上では、以下を実行してインストールした。
- PyOpenGL-3.1.0.win32-py2.7.exe
- PyOpenGL-accelerate-3.1.0.win32-py2.7.exe
_pyopengl_310_win32_py27_setup.zip
◎ PyOpenGLだけなら問題無し。 :
PyOpenGL のバージョンが上がったことで teapot 関係の機能が削除されたのではと疑ったりもしたけれど、pygame と組み合わせず、PyOpenGL だけを使った場合は teapot もフツーに描画できた。以下は動作したスクリプト。
_teapot_draw.py
ということで、Pygame と PyOpenGL を組み合わせて、かつ、今現在のバージョンで動かした時だけ teapotの描画が何故かできないという…。
でもまあ、teapot描画を何かしら実用的なアレコレで使うかと言えば、そういうわけでもないし…。大体は、サンプルスクリプトの一例として使う場合がほとんどだから…。
そもそも、Pygame と PyOpenGL を組み合わせて使う場面自体がほとんど無いのではないかという気もするし…。こういう状態でも、実害は皆無かもしれず。
_teapot_draw.py
ということで、Pygame と PyOpenGL を組み合わせて、かつ、今現在のバージョンで動かした時だけ teapotの描画が何故かできないという…。
でもまあ、teapot描画を何かしら実用的なアレコレで使うかと言えば、そういうわけでもないし…。大体は、サンプルスクリプトの一例として使う場合がほとんどだから…。
そもそも、Pygame と PyOpenGL を組み合わせて使う場面自体がほとんど無いのではないかという気もするし…。こういう状態でも、実害は皆無かもしれず。
[ ツッコむ ]
以上です。