Bullet 学习笔记之 btSoftBody
Soft Body 是 Bullet 引擎中用于布料、軟體等形變仿真的類。
1、軟體的基本組成元素 Node 、Link、Face、Tetra 以及 Material
在 soft body 中,一般是由點、線、面、四面體單元等基本元素構成。下面將分別介紹一下,各個元素的代碼,以及使用方法。
1.1、Node
Node 是軟體中的節點類,其定義為:
/* Node */
struct Node : Feature
{
btVector3 m_x; // Position
btVector3 m_q; // Previous step position/Test position
btVector3 m_v; // Velocity
btVector3 m_vsplit; // Temporary Velocity in addintion to velocity used in split impulse
btVector3 m_vn; // Previous step velocity
btVector3 m_f; // Force accumulator
btVector3 m_n; // Normal
btScalar m_im; // 1/mass
btScalar m_area; // Area
btDbvtNode* m_leaf; // Leaf data
bool m_constrained; // constrained node
int m_battach : 1; // Attached
int index;
};
其中,包含了(當前時刻的)位置 m_x 前一時刻的位置 m_q 、(當前時刻的)速度 m_v 、某速度 m_vsplit 、前一時刻的速度 m_vn 、所受的合力 m_f 、法向量 m_n (不知道做什么的)、質量的倒數 m_im 、面積 m_area 、btDvtNode 、約束標志位 m_constrained 、固定標志位 m_battach 、節點編號 index 。以及材料參數 Feature::m_material 。
大致也能明白這些參數/信息是什么。
1.2、Link
連線類的定義為:
/* Link */
ATTRIBUTE_ALIGNED16(struct)
Link : Feature
{
btVector3 m_c3; // gradient
Node* m_n[2]; // Node pointers
btScalar m_rl; // Rest length
int m_bbending : 1; // Bending link
btScalar m_c0; // (ima+imb)*kLST
btScalar m_c1; // rl^2
btScalar m_c2; // |gradient|^2/c0
BT_DECLARE_ALIGNED_ALLOCATOR();
};
連線類 Link 包含了連線的兩個頂點(指針)、gradient、初始長度、一些參數、以及材料參數 Feature::m_material 。
具體的一些參數的用法,后面再細究吧。可能有的也不一定會用到。因為,不同的算法,所用到的參數也不盡相同。
1.3、Face
三角形面片類的定義為:
/* Face */
struct Face : Feature
{
Node* m_n[3]; // Node pointers
btVector3 m_normal; // Normal
btScalar m_ra; // Rest area
btDbvtNode* m_leaf; // Leaf data
btVector4 m_pcontact; // barycentric weights of the persistent contact
btVector3 m_n0, m_n1, m_vn;
int m_index;
};
三角形面片類 Face 包含了三個頂點(指針)、法向量、初始面積、btDvtNode* 、m_pcontact 應該是碰撞點在三角形面片中的質心坐標(barycentric weights)、m_n0、m_n1、m_n2(應該是三個頂點的法向量?)、編號 m_index 、以及材料參數 Feature::m_material 。
大致也能明白這些信息。個別信息的用處,后面再慢慢細究吧。
1.4、Tetra
四面體單元類其定義為:
/* Tetra */
struct Tetra : Feature
{
Node* m_n[4]; // Node pointers
btScalar m_rv; // Rest volume
btDbvtNode* m_leaf; // Leaf data
btVector3 m_c0[4]; // gradients
btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3)
btScalar m_c2; // m_c1/sum(|g0..3|^2)
btMatrix3x3 m_Dm_inverse; // rest Dm^-1
btMatrix3x3 m_F;
btScalar m_element_measure;
};
也就是說,Tetra 包含了四面體單元頂點(指針)、初始體積、btDbvtNode*(不知道做什么的)、gradient、某某變量、invDm、形變梯度 (oldsymbol{F}) 、某某變量、材料參數 Feature::m_material 。
這些也基本上包含了軟體形變仿真中四面體單元相關的變量。只是,有幾個變量還不太清楚是做什么的。
1.5、Mateiral
材料參數的定義如下
/* Material */
struct Material : Element
{
btScalar m_kLST; // Linear stiffness coefficient [0,1]
btScalar m_kAST; // Area/Angular stiffness coefficient [0,1]
btScalar m_kVST; // Volume stiffness coefficient [0,1]
int m_flags; // Flags
};
具體,這個材料參數是用來做什么的,后續再看吧
2 軟體的建立及初始化
在 btSoftBody 中,軟體的節點、網格、面片等數據,存儲在以下成員變量中:
tNodeArray m_nodes; // Nodes
tNodeArray m_renderNodes; // Nodes
tLinkArray m_links; // Links
tFaceArray m_faces; // Faces
tFaceArray m_renderFaces; // Faces
tTetraArray m_tetras; // Tetras
btAlignedObjectArray<btVector3> m_X; // initial positions
btSoftBody 的建立及初始化過程可以參見 btSoftBody* btSoftBodyHelpers::CreateFromTetGenData(..)
2.1、構造函數
首先,讀取節點的位置,并由此新建一個 btSoftBody 對象:
btSoftBody* psb = new btSoftBody(&worldInfo, nnode, &pos[0], 0);
在btSoftBody 的構造函數中,初始化了一系列的內部參數;新建并初始化了材料 Material m_materials ;新建了 N 個 Node ,存入節點位置等信息,并將初始節點位置放入 m_X 中;在 m_ndbvt 中插入節點,并將該節點的指針放入節點的 n.m_leaf 中;更新 m_bounds (這個估計跟 AABB 類似,就是一個邊界包圍盒吧);更新 m_quads (不知道是用來做什么的)
2.2、添加面片 Face
通過函數 btSoftBody::appendFace(...) 向軟體對象中添加三角形面片。通常情況下,添加四面體單元時,已經添加過邊線了,這里就不需要再重復添加表面網格的邊線。
2.3、添加四面體單元 Tetra
通過函數 btSoftBody::appendTetra(...) 向軟體對象中添加四面體單元。此外,還需要添加四面體單元的四條邊線 Line ,即通過 btSoftBody::appendLink(...) 向軟體對象中添加邊線。
2.4、進一步初始化
添加完軟體對象的網格數據后,還需要進一步初始化,比如,計算四面體單元的 invDm。
3、btDbvt Tree
在 Bullet 物理引擎中,對于 btDbvt 類的定義及說明如下:
///The btDbvt class implements a fast dynamic bounding volume tree based on axis aligned bounding boxes (aabb tree).
///This btDbvt is used for soft body collision detection and for the btDbvtBroadphase. It has a fast insert, remove and update of nodes.
///Unlike the btQuantizedBvh, nodes can be dynamically moved around, which allows for change in topology of the underlying data structure.
struct btDbvt
{ ... }
也就是說,這個本質上是一個用于碰撞檢測(broad phase)的 AABB tree 。關于它是如何實現的,就先不討論了。在 btSoftBody 中,相關的 AABB tree 有如下這些:
btDbvt m_ndbvt; // Nodes tree
btDbvt m_fdbvt; // Faces tree
btDbvntNode* m_fdbvnt; // Faces tree with normals
btDbvt m_cdbvt; // Clusters tree
4、btSoftBody 的其他成員變量
如 Anchor 、 RContact 、 SContact 、 Joint 、 Cluster 、等等
5、位移預計算 btSoftBody::predictMotion
參見 Bullet 學習筆記之 btSoftBody::predictMotion
6、約束計算 btSoftBody::solveClusters
參見 Bullet 學習筆記之 btSoftBody::predictMotion
7、碰撞處理 btSoftBody::defaultCollisionHandler(btSoftBody* psb)
參見 Bullet 學習筆記之 btSoftBody::predictMotion
8、總結
待續
總結
以上是生活随笔為你收集整理的Bullet 学习笔记之 btSoftBody的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gtf文件学习+读取
- 下一篇: FFmpeg常用命令:如何将mp4转gi