コンピュータで「実世界にある何者かをエミュレートする」ということについて。
例えばCGの中でモノをそれらしく動かして見せるにはおおよそ古典力学の諸々の法則に準拠して動かす必要があって、それをサポートする機能がアプリケーションに備わっている。
それが「物理演算エンジン」と呼ばれるもの。
CGでは「それらしく見せる」ことができれば十分なので理学・工学のものよりは良くも悪くも「いいかげん」なエンジンが使われていて、厳密さより高速に計算できることを優先しているらしい。
確かに有限要素法とかで三次元の解析などをすると平気で数日かかったりするので、厳密さの切り捨ては仕方ないのは理解できる。
おおよそCGに使う(光関連を除く)物理演算は「剛体」「弾性体」「流体」「その他の炎とか爆発とか煙とかいくぶん厄介なもの」あたりに分けられて、一般的に後ろに行くほど扱いの難易度が高くなる。
まずは最も基本である変形のない「剛体」を扱う物理演算エンジンについて勉強中。
その際ブラックボックスで融通が利かないアプリケーション付属のエンジンは使いたくないため、C++のライブラリとしてプログラムから叩けるものをいくつか評価しているところ。
そういう目的に使われるライブラリでオープンソースかつメジャーなものはおおよそ以下の3つらしい。
ODE(Open Dynamics Engine)
https://www.ode.org/
Bullet Physics
https://github.com/bulletphysics/bullet3
PhysX
https://github.com/NVIDIAGameWorks/PhysX
Webの情報から判断すると下にいくほど性能が高く、扱いの容易さはその逆ということ。
さしあたっては扱いが比較的簡単らしいODEから評価を始めているところ。
基本中の基本である自由落下から。
操作対象としては前回で書いたPhotogrammetryで三次元取得した葉っぱを使う。
まずは葉っぱのメッシュデータからAABBというものを計算してぴったり入る箱のサイズを作る。こうすることで衝突の計算が高速になる。
これらの箱数百個を時間差で上から落として若干跳ね返りをつけたものをODEでシミュレート。
このとき、各タイムステップですべての物体の位置と回転の軌跡を記録しておく。
完了したら葉のメッシュデータと軌跡をblenderに読み込んで、背景と照明をそれらしくつけて作りこんでみた。
ODEの挙動と最終結果は以下のような感じ。
これだけでもかなり現実世界に近づいた絵が作れる。しかもすべてオープンソースのツールで。テクノロジーの進歩はたいしたものです。
葉っぱという物体、剛体運動の練習台としてかなり面白いのでしばらく遊んでみようかと思ってます。