3DCG

Python3で「OpenGL」を学ぶ 「PyOpenGL」PyCG lesson6

lesson6を学んだ。順にそれぞれ自分の理解をメモしながらまとめる。

バークレーのCGの講義で、CGの素晴らしさを示すために本稿のデモのような布のシミュレーションのビデオを使っている。背景にある数学はそれほど難しくなく、シミュレーションを作るのはとてもかんたんである。

質量バネモデル

布の挙動の性質は、質量バネモデルで近似することができる。布は点状質量のm×n個のグリッドとして記述され、点状質量はバネによって接続される。布をより正確にシミュレートするために、与えられた点の配列(i,j)に対して、3種のバネがある。(有限要素解析のようなより現実的で複雑な手法も存在する)

構造バネ、せん断バネ、ベンドバネの3種類のバネ、内部力、粘性の減衰、重力、風の4つの要素の総和よって、点が受ける力が決まる。モデルの詳細は、元記事のThe mass-spring model の項を参照。また、次の状態の解法についても、小さな時間増分Δt後の状態の計算方法として、簡単なオイラー法を用いて計算コストが小さいことを確認した。Δtの選択には注意が必要で、線形系がΔtが系の自然周期よりも大きい場合に発散する。(デモでは、安定させるために小さなΔtを選択し、5倍に加速させる必要がある。そのためアニメーションの時間が長くなっている)

Pythonで実装する

Pythonで実装する場合は、実行速度を考慮し、ループの使用は避け、numpyを使用する必要がある。表面法線の計算のみ(点の表面法線を見つける必要がある)Pythonのループが必要。20×20よりも大きなグリッドを使用した場合、フレームレートは10fps以下に落ちることがある。より魅力的なアニメーションを作るために、布の右下に小さな局所的な風を当てている。(このデモは、2018年春のバークレーCS184の課題を簡略化したものであった)

デモ

コードはGitHubを参照。

  • “W, A, S, D” と、マウスを使ってシーンを移動する
  • “ESC” を押下で、終了
  • “o “を押下で、塗りとワイヤフレームを切り替える
  • “p “を押下で、スクリーンショットを撮る