3DCG

PythonでBVHを描画してみる BVwHacker

GitHubに参考になりそうなプロジェクトがあったため、メモ。

以下の環境が必要。

  • python 2.6 or higher
  • pyOpenGL (GL, GLU, GLUT) (http://pyopengl.sourceforge.net/)
  • wxPython (http://numpy.scipy.org/)
  • numpy (http://www.wxpython.org/)

Anacondaで新たに環境を構築しつつ、実行を確認する。

conda create --name py27 python=2.7
conda activate py27

conda install wxPython
conda install pyopengl
conda install numpy

以下で実行できる。

python bvwhacker.py

macOS Big Surでは以下のようなエラーがでる。

ImportError: ('Unable to load OpenGL library', 'dlopen(OpenGL, 10): image not found', 'OpenGL', None)
#/lib/python2.7/site-packages/OpenGL/platform/ctypesloader.py 内の35行目、
# fullName = util.find_library( name ) を以下に変更する
fullName = "/System/Library/Frameworks/{}.framework/{}".format(name, name)

さらに以下のエラーが出る。

This program needs access to the screen. Please run with a
Framework build of python, and only when you are logged in
on the main display of your Mac.

この場合は以下のように、pythonwとすると起動できるらしい。

pythonw bvwhacker.py

ただし以下のようなエラーが出ており、描画されない…。

vwhacker.py:25: wxPyDeprecationWarning: Call to deprecated item __call__. Use :meth:`EvtHandler.Bind` instead.
  wx.EVT_PAINT(self, self.OnDraw)
bvwhacker.py:26: wxPyDeprecationWarning: Call to deprecated item __call__. Use :meth:`EvtHandler.Bind` instead.
  wx.EVT_SIZE(self, self.OnSize)
bvwhacker.py:27: wxPyDeprecationWarning: Call to deprecated item __call__. Use :meth:`EvtHandler.Bind` instead.
  wx.EVT_MOTION(self, self.OnMouseMotion)
bvwhacker.py:32: wxPyDeprecationWarning: Call to deprecated item __call__. Use :meth:`EvtHandler.Bind` instead.
  wx.EVT_WINDOW_DESTROY(self, self.OnDestroy)
<wx._core.Slider object at 0x7fb848027d70>
<wx._core.Button object at 0x7fb848027c30>
<wx._core.StaticText object at 0x7fb848027c30>
Traceback (most recent call last):
  File "bvwhacker.py", line 46, in OnDraw
    self.SetCurrent()
TypeError: GLCanvas.SetCurrent(): not enough arguments

以下のように修正することで動作を確認できた。

# 初期化時にcanvasを設定 self.init = True直前あたりで以下をしておく
self.context = wx.glcanvas.GLContext(self)

# onDraw内のself.context = canvas.GLContext()に以下のように引数をセット
self.context = canvas.GLContext(self.canvas)

(ただし、UI回りは崩れていたり、スライダを動かすと反映されるが下のボタンを押しても動作しない。ひとまず描画まで出来たので一旦ここまで。)