非圧縮性流体を使った SoftBodyの挙動制御

なんか難しそうなタイトルですが、ようするにSoftBody内部を水で満たすことで動きの制御を行う方法を考えてみました。と思ったら、すでにSoftBodyにその機能がありました。体積を一定に保つように全ノードに膨張または縮小させる力を働かせるための設定とパラメータが用意されています。
なので、その機能の説明と適用した場合の動きを紹介します。

SoftBodyを布に使ってみようとしていましたが、まったくうまくいかないので、本来のSoftBodyの使い方に戻します。何百回と形状やパラメータを調整してもダメでした(心が折れました)。


解説動画


SoftBodyで形状を保つには

SoftBodyで物体を表現する際、形状をある程度保つようにする必要があります。以下の処理を組み合わせて、挙動の制御を行います。

リンク拘束

ノード間を接続する拘束で、SoftBodyの基本処理。この効果を強くしたり、補助用Linkを追加で形状を保つ。ただ固すぎると剛体と変わらなくなる(というより劣化剛体)。
補助用ノード、リンクで様々な状態を作り出せるが、その構造の作成が困難。専用ツールやプラグインがないと手作業では厳しい。

SetPose(false,true);とm_cfg.kMT

作成時の位置を保存しておき、その位置へ戻す力を各ノードに加える処理。効果は高いが、バネのように振動したり、重さを感じない挙動になる。
SoftBody全体が移動した場合、重心とノード分布から姿勢行列を求め、作成時の位置を変換する。これで全体的な移動や回転しつつ、形状を保持させる。

SetPose(true,false);とm_cfg.kPR,kVC

SetPose(true,)で体積の計算が有効になる。
m_cfg.kPR:膨張力 全Faceの法線方向にkPR/体積の力
m_cfg.kVC:体積一定 全Faceの法線方向にkVC*(元の体積 – 現在の体積)の力
kPRは風船,kVCは水風船のような挙動になる。
この機能を使うことで、柔らかさと形状の保持の両立、重量感、中身が詰まった感じが出せる。

その他

調べれば、他にも機能があるはず。


サンプルプログラム

動画作成用のプログラムです。
bulletのヘルパー関数を使わずに、SoftBodyを独自データ構造(mqoファイルから構築)から生成しています。zg_bullet.h/cpp struct CreateSoftBody;
非圧縮性流体を使った SoftBodyの挙動制御


リンクなど

Bullet Physics Library

http://bulletphysics.org/

動画フォント(フリー素材)

「じゆうちょうフォント」 / 『よく飛ばない鳥』
「りいポップ角」 / 『りいのフォント』

動画作成

「ゆっくりMovieMaker」 / 『饅頭遣いのおもちゃ箱』
「AviUtl」 / 『AviUtlのお部屋』

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.