Bullet 学习笔记之 btSoftBody
Soft Body 是 Bullet 引擎中用于布料、軟體等形變仿真的類。
1、軟體的基本組成元素 Node 、Link、Face、Tetra 以及 Material
在 soft body 中,一般是由點(diǎn)、線、面、四面體單元等基本元素構(gòu)成。下面將分別介紹一下,各個(gè)元素的代碼,以及使用方法。
1.1、Node
Node 是軟體中的節(jié)點(diǎn)類,其定義為:
/* 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;
};
其中,包含了(當(dāng)前時(shí)刻的)位置 m_x 前一時(shí)刻的位置 m_q 、(當(dāng)前時(shí)刻的)速度 m_v 、某速度 m_vsplit 、前一時(shí)刻的速度 m_vn 、所受的合力 m_f 、法向量 m_n (不知道做什么的)、質(zhì)量的倒數(shù) m_im 、面積 m_area 、btDvtNode 、約束標(biāo)志位 m_constrained 、固定標(biāo)志位 m_battach 、節(jié)點(diǎn)編號(hào) index 。以及材料參數(shù) Feature::m_material 。
大致也能明白這些參數(shù)/信息是什么。
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 包含了連線的兩個(gè)頂點(diǎn)(指針)、gradient、初始長(zhǎng)度、一些參數(shù)、以及材料參數(shù) Feature::m_material 。
具體的一些參數(shù)的用法,后面再細(xì)究吧。可能有的也不一定會(huì)用到。因?yàn)椋煌乃惴ǎ玫降膮?shù)也不盡相同。
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 包含了三個(gè)頂點(diǎn)(指針)、法向量、初始面積、btDvtNode* 、m_pcontact 應(yīng)該是碰撞點(diǎn)在三角形面片中的質(zhì)心坐標(biāo)(barycentric weights)、m_n0、m_n1、m_n2(應(yīng)該是三個(gè)頂點(diǎn)的法向量?)、編號(hào) m_index 、以及材料參數(shù) Feature::m_material 。
大致也能明白這些信息。個(gè)別信息的用處,后面再慢慢細(xì)究吧。
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 包含了四面體單元頂點(diǎn)(指針)、初始體積、btDbvtNode*(不知道做什么的)、gradient、某某變量、invDm、形變梯度 (oldsymbol{F}) 、某某變量、材料參數(shù) Feature::m_material 。
這些也基本上包含了軟體形變仿真中四面體單元相關(guān)的變量。只是,有幾個(gè)變量還不太清楚是做什么的。
1.5、Mateiral
材料參數(shù)的定義如下
/* 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
};
具體,這個(gè)材料參數(shù)是用來(lái)做什么的,后續(xù)再看吧
2 軟體的建立及初始化
在 btSoftBody 中,軟體的節(jié)點(diǎn)、網(wǎng)格、面片等數(shù)據(jù),存儲(chǔ)在以下成員變量中:
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、構(gòu)造函數(shù)
首先,讀取節(jié)點(diǎn)的位置,并由此新建一個(gè) btSoftBody 對(duì)象:
btSoftBody* psb = new btSoftBody(&worldInfo, nnode, &pos[0], 0);
在btSoftBody 的構(gòu)造函數(shù)中,初始化了一系列的內(nèi)部參數(shù);新建并初始化了材料 Material m_materials ;新建了 N 個(gè) Node ,存入節(jié)點(diǎn)位置等信息,并將初始節(jié)點(diǎn)位置放入 m_X 中;在 m_ndbvt 中插入節(jié)點(diǎn),并將該節(jié)點(diǎn)的指針放入節(jié)點(diǎn)的 n.m_leaf 中;更新 m_bounds (這個(gè)估計(jì)跟 AABB 類似,就是一個(gè)邊界包圍盒吧);更新 m_quads (不知道是用來(lái)做什么的)
2.2、添加面片 Face
通過函數(shù) btSoftBody::appendFace(...) 向軟體對(duì)象中添加三角形面片。通常情況下,添加四面體單元時(shí),已經(jīng)添加過邊線了,這里就不需要再重復(fù)添加表面網(wǎng)格的邊線。
2.3、添加四面體單元 Tetra
通過函數(shù) btSoftBody::appendTetra(...) 向軟體對(duì)象中添加四面體單元。此外,還需要添加四面體單元的四條邊線 Line ,即通過 btSoftBody::appendLink(...) 向軟體對(duì)象中添加邊線。
2.4、進(jìn)一步初始化
添加完軟體對(duì)象的網(wǎng)格數(shù)據(jù)后,還需要進(jìn)一步初始化,比如,計(jì)算四面體單元的 invDm。
3、btDbvt Tree
在 Bullet 物理引擎中,對(duì)于 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
{ ... }
也就是說,這個(gè)本質(zhì)上是一個(gè)用于碰撞檢測(cè)(broad phase)的 AABB tree 。關(guān)于它是如何實(shí)現(xiàn)的,就先不討論了。在 btSoftBody 中,相關(guān)的 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、位移預(yù)計(jì)算 btSoftBody::predictMotion
參見 Bullet 學(xué)習(xí)筆記之 btSoftBody::predictMotion
6、約束計(jì)算 btSoftBody::solveClusters
參見 Bullet 學(xué)習(xí)筆記之 btSoftBody::predictMotion
7、碰撞處理 btSoftBody::defaultCollisionHandler(btSoftBody* psb)
參見 Bullet 學(xué)習(xí)筆記之 btSoftBody::predictMotion
8、總結(jié)
待續(xù)
總結(jié)
以上是生活随笔為你收集整理的Bullet 学习笔记之 btSoftBody的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gtf文件学习+读取
- 下一篇: FFmpeg常用命令:如何将mp4转gi