見出し画像

Bullet Physics SoftBodyを使ってみる / C++ / VS2022

※ブログで公開していた記事です。情報が古いかもしれません。

Bullet PhysicsのSoftBodyが前から気になっていたので試してみます。
ソフトボディーと聞いてまず"ぬいぐるみ"を思い浮かべたので、ぬいぐるみっぽい動きを実現することを目標にします。
まずは、任意形状のポリゴンモデルをSoftBody機能を使って動かすために
必要な準備やパラメータ設定を調べ、実験用プログラムの作成。

Soft Body

物理エンジンでよく使われる剛体とは異なり、衝突など力が加えられると変形する物体のシミュレーションです。
使い所の難しい機能ですが、うまく使えばグラフィック表現が格段に上がるはずです。

Bullet Physicsの準備

基本的な操作は剛体と同じです。ソフトボディーを扱うための専用クラスを使用、いくつかの追加処理が必要です。

初期化

//ソフトボディーと剛体の衝突設定
pCollConfig = new btSoftBodyRigidBodyCollisionConfiguration;

//Dispatcher&Solver 剛体と同じ
pDispatcher = new btCollisionDispatcher(pCollConfig);
pSolver = new btSequentialImpulseConstraintSolver;

//Broadphase 剛体と同じ
btVector3 worldAabbMin(-1000,-1000,-1000);
btVector3 worldAabbMax(1000,1000,1000);
pBroadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, MAX_PROXIES);
//pBroadphase = new btDbvtBroadphase;
//いくつか用意されているものを状況に合わせて選択

// ソフトボディー管理情報
// align16 SIMD計算 
pSoftBodyWorldInfo = new(_aligned_malloc(sizeof(btSoftBodyWorldInfo),__alignof(btSoftBodyWorldInfo)) ) btSoftBodyWorldInfo;	
pSoftBodyWorldInfo->m_dispatcher = pDispatcher;
pSoftBodyWorldInfo->m_broadphase = pBroadphase;
pSoftBodyWorldInfo->m_gravity.setValue(0,-10,0);
pSoftBodyWorldInfo->m_sparsesdf.Initialize();

// SoftBody&Rigid物理ワールド作成
pDynamicsWorld = new btSoftRigidDynamicsWorld(pDispatcher, pBroadphase, pSolver, pCollConfig, nullptr);
pDynamicsWorld->setDebugDrawer(nullptr);
pDynamicsWorld->setGravity(btVector3(0,-10,0));

ソフトボディーの作成

頂点や拘束などの設定を登録していくことで作成しますが、作成支援クラス(btSoftBodyHelpers)を使うことで面倒な作成処理をせずにソフトボディーを簡単に作成できます。
細かい作成処理は必要になった時に調べることにして、とりあえずやってみる。

任意形状(3角形ポリゴン)のソフトボディー作成btSoftBodyHelpers::CreateFromTriMesh( … )
にポリゴン情報を渡すだけ。

パラメータ調整
そのままでは形状が保てずつぶれてしまうため、形を保持するための設定が必要です。

btSoftBody::randomizeConstraints()
 ランダムに選んだ頂点間を拘束、全体の形状を保つ

btSoftBody::generateBendingConstraints()
 近くにある頂点同士を拘束、表面を固くする効果

btSoftBody::Material.m_kLST
 generateBendingConstraintsの固さ設定 0~1

btSoftBody::setPose()
 初期位置を保とうとする力を発生させる。効果大だが柔軟性がなくなる。
 ※btSoftBody::scale()で大きさを変える場合、setPoseの前に実行

btSoftBody.m_cfg.kMT
 setPoseの効果 0~1

btSoftBody.m_cfg.collisions |= btSoftBody::fCollision::VF_SS;
 ソフトボディー同士の衝突有効


デモプログラム

Bullet Soft Body実験用プログラム
簡単な自作スクリプトで剛体やソフトボディーを追加、パラメータ調整
Visual Studio 2022(Windows)用プロジェクト
Bullet3.24同梱、すぐにビルド&実行できます


前のバージョン(2022/6/30)
DirectXデバッグ機能がないとDebugが起動しない不具合
x86のビルドができない
Bulletバグ(たぶん) x86で実行エラー(align16)

この記事が役に立ったという方は、サポートお願いします。今後の製作の励みになります。