LoginSignup
3
2

More than 3 years have passed since last update.

PyODE チュートリアル 3

Last updated at Posted at 2020-05-05

PyODE本家チュートリアル3を実施しました

本家 PyODE 様サイト

「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使用)
tutorial3.gif

・視点は本家様コードから値を変えてあります。

画像保存ルーチン

PNG 画像群と GIF 動画1個をファイル出力します。
追記部分だけ ↓ に載せときます。
※元のコードには画像出力がないと思ったのでこのように追加しましたが、見落としてるのかもしれない。

使いかた:
  ・「Pillow」をインストールしとく。
  ・実行前にあらかじめカレントにフォルダ2個「img」と「gif」を作る。
  ・オリジナル231行め「glutSwapBuffers ()」の後で 追加ルーチン「capture()」を呼ぶ。
  ・同じく220行め 「sys.exit (0)」の前とかで 「export_movie()」を呼ぶ
     

PyOpenGLからスナップショット生成/保存
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 )
GIF動画保存ルーチン

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)
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2