Bullet 2.76 Physics SDK マニュアル
10. ソフトボディ
はじめに
ソフトボディは剛体の他に、ロープや布のシミュレーション、また体積のある柔らかい物体を扱うことができます。ソフトボディ、剛体、衝突形状の相互作用が可能です。
- btSoftBody はソフトボディの基本となる、btCollisionObjectから派生したクラスです。剛体とは異なり、ソフトボディのワールド変換行列は1つではありません。各ノードや頂点ごとに、ワールド座標を持ちます。
- btSoftRigidDynamicsWorldはソフトボディ、剛体、拘束条件を保持するコンテナです。
ソフトボディシミュレーションについて学ぶには、Demos/SoftBodyDemo を見るのが最良の方法です。
以下に、基本的なガイドラインについて簡単に説明します。
三角形メッシュからの作成
btSoftBodyHelpers::CreateFromTriMeshは、三角形メッシュから自動的にソフトボディを生成してくれます。
衝突クラスタ
デフォルトでは、ソフトボディは衝突判定を頂点(ノード)と三角形(面)の間で行います。これには難解なテッセレーションが必要であり、そうしないと衝突判定に失敗してしまいます。改良メソッドを使うと、自動的に凸形状の可変クラスタに分解することができます。衝突クラスタを有効にするには、以下のように実行してください。
psb->generateClusters(numSubdivisions);
//enable cluster collision between soft body and rigid body
psb->m_cfg.collisions += btSoftBody::fCollision::CL_RS;
//enable cluster collision between soft body and soft body
psb->m_cfg.collisions += btSoftBody::fCollision::CL_SS;
ソフトボディ、AllBulletDemoでは、凸形状衝突クラスタを視覚化するデバッグオプションが付いています。
ソフトボディに力を加える
すべてもしくは各頂点(ノード)に対して力を加えるには、下記メソッドを使ってください。
softbody ->addForce(const btVector3& forceVector);
softbody ->addForce(const btVector3& forceVector,int node);
ソフトボディの拘束条件
以下のメソッドにより、指定の頂点(ノード)を固定して動かないようにすることができます。
softbody->setMass(node,0.f);
また、ソフトボディの頂点を剛体にくっつけることができます。
softbody->appendAnchor(int node,btRigidBody* rigidbody, bool disableCollisionBetweenLinkedBodies=false);
ソフトボディ同士をくっつけることもできます。これについては Bullet/Demos/SoftBodyをご覧ください。