日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

Bullet 学习笔记之 btSoftBody

發(fā)布時(shí)間:2023/12/13 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 Bullet 学习笔记之 btSoftBody 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)/信息是什么。

連線類的定義為:

/* 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 的其他成員變量

AnchorRContactSContactJointCluster 、等等


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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。