#PyODE本家チュートリアル3を実施しました
「Tutorial 3」は接触判定のサンプルです。可視化はPyOpenGLです。
・PyOpenGLのセットアップが必要です。
・OpenGL ということで、3Dということもあり可視化のコード記述が多いです。
※筆者はC/C++でOpenGL使用したことあるため、(なにやってるか見当はついたので、)このコードはほとんど読んでません。あしからず。
##PyOpenGLセットアップ
少々てこずりました。
・https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyopengl
から「PyOpenGL-3.1.5-cp38-cp38-win_amd64.whl」を取得して pip でインストールした。
→ チュートリアル3 が正常動作。
※ pip自動取得からでは正常動作しなかった。 詳細こちら → Python3でPyOpenGLセットアップ
ちなみにpyopenglと一緒に「PyOpenGL_accelerate」も入れるものらしいですが、筆者はまだインストールしていません。
##結果
「Tutorial 3」が動きました。
画像の保存ルーチンを追加してGIF動画つくってみました。(Pillow使用)
・視点は本家様コードから値を変えてあります。
##画像保存ルーチン
PNG 画像群と GIF 動画1個をファイル出力します。
追記部分だけ ↓ に載せときます。
※元のコードには画像出力がないと思ったのでこのように追加しましたが、見落としてるのかもしれない。
使いかた:
・「Pillow」をインストールしとく。
・実行前にあらかじめカレントにフォルダ2個「img」と「gif」を作る。
・オリジナル231行め「glutSwapBuffers ()」の後で 追加ルーチン「capture()」を呼ぶ。
・同じく220行め 「sys.exit (0)」の前とかで 「export_movie()」を呼ぶ
from PIL import Image
from PIL import ImageOps
step=-1
intvl = 10
imgs = []
def capture():
global step
step += 1
if step % intvl != 0:
return
pad_step = '{0:04d}'.format(step)
print( pad_step )
savepath = "img/tutorial3_"+pad_step+".png"
width = glutGet(GLUT_WINDOW_WIDTH)
height = glutGet(GLUT_WINDOW_HEIGHT)
glReadBuffer(GL_FRONT)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
data = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE)
#image = Image.fromstring("RGBA", (width, height), data)
image = Image.frombytes("RGBA", (width, height), data)
image = ImageOps.flip(image)
image.save( savepath )
imgs.append( image )
def export_movie():
if not imgs:
return
imgs[0].save('gif/tutorial3.gif'
, save_all=True
, append_images=imgs[1:]
, optimize=False
, duration=100 #40
, loop=0)