C++でふわっとしたパーティクルエンジンをつくった

f:id:ttata:20150316103025p:plain

とりあえず動くところまで漕ぎ着けた.

パーティクルのふるまいをふわっと計算する.当たり判定の面倒な処理は適当にやってくれる.数万パーティクルくらいならそれなりに動く.

こんな感じで動く.ゆっさゆっさ.

動機

@toshiemon18と一緒につくっているツイッタークライアントで適当な可視化ツールが必要になったことと,この手のパーティクルを用いた表現はよく使うので,調度良い機会なので書いた.

おおまかな使い方

パーティクルの振る舞いは,ふたつのパーティクル間での任意の拘束条件std::function<Vector3d(Particle,Particle)>によって定義できる.上の画像や動画は空間の原点から一定の距離になるような条件を用いてパーティクルに力を与えている. ふたつのパーティクルの関係は拘束条件を用いて,ConstraintPair(Particle,Particle,std::function<...>)によって定義する.必要なライブラリはEigenだけなので,それなりに使いまわせると思う.

中身

以下のパイプラインで処理が進行する.

CollisionDetecotr

衝突判定のブロードフェーズでAABBTreeを用いて衝突可能性のあるペアを絞り込むことで高速化してる.鉄板ですね.その後詳細判定を行った後,衝突する場合であればConstraintPairを生成する.あまり高密度にパーティクルを配置すると流石に重い.並列化で改善の余地あり.

ConstraintSolver

ConstraintPairを計算し,パーティクルに加速度を与える.並列化で改善の余地あり.

Integrator

加速度から速度,位置を更新する.数値積分はEuler陽解法なので精度はガバガバ.記事書いてる途中で気がついたけど⊿t考慮してない.後で修正しよう.並列化で改善の余地あり.