add demo to test soft body friction
This commit is contained in:
@@ -13,8 +13,8 @@
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
#ifndef BT_DEFORMABLE_RIGID_DYNAMICS_WORLD_H
|
||||
#define BT_DEFORMABLE_RIGID_DYNAMICS_WORLD_H
|
||||
#ifndef BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H
|
||||
#define BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H
|
||||
|
||||
#include "btSoftMultiBodyDynamicsWorld.h"
|
||||
#include "btDeformableLagrangianForce.h"
|
||||
@@ -36,7 +36,6 @@ typedef btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
|
||||
class btDeformableMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld
|
||||
{
|
||||
typedef btAlignedObjectArray<btVector3> TVStack;
|
||||
// using TVStack = btAlignedObjectArray<btVector3>;
|
||||
///Solver classes that encapsulate multiple deformable bodies for solving
|
||||
btDeformableBodySolver* m_deformableBodySolver;
|
||||
btSoftBodyArray m_softBodies;
|
||||
@@ -162,4 +161,4 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#endif //BT_DEFORMABLE_RIGID_DYNAMICS_WORLD_H
|
||||
#endif //BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H
|
||||
|
||||
@@ -1387,6 +1387,76 @@ btSoftBody* btSoftBodyHelpers::CreateFromVtkFile(btSoftBodyWorldInfo& worldInfo,
|
||||
return psb;
|
||||
}
|
||||
|
||||
void btSoftBodyHelpers::generateBoundaryFaces(btSoftBody* psb)
|
||||
{
|
||||
int counter = 0;
|
||||
for (int i = 0; i < psb->m_nodes.size(); ++i)
|
||||
{
|
||||
psb->m_nodes[i].index = counter++;
|
||||
}
|
||||
typedef btAlignedObjectArray<int> Index;
|
||||
btAlignedObjectArray<Index> indices;
|
||||
indices.resize(psb->m_tetras.size());
|
||||
for (int i = 0; i < indices.size(); ++i)
|
||||
{
|
||||
Index index;
|
||||
index.push_back(psb->m_tetras[i].m_n[0]->index);
|
||||
index.push_back(psb->m_tetras[i].m_n[1]->index);
|
||||
index.push_back(psb->m_tetras[i].m_n[2]->index);
|
||||
index.push_back(psb->m_tetras[i].m_n[3]->index);
|
||||
indices[i] = index;
|
||||
}
|
||||
|
||||
std::map<std::vector<int>, std::vector<int> > dict;
|
||||
for (int i = 0; i < indices.size(); ++i)
|
||||
{
|
||||
for (int j = 0; j < 4; ++j)
|
||||
{
|
||||
std::vector<int> f;
|
||||
if (j == 0)
|
||||
{
|
||||
f.push_back(indices[i][1]);
|
||||
f.push_back(indices[i][0]);
|
||||
f.push_back(indices[i][2]);
|
||||
}
|
||||
if (j == 1)
|
||||
{
|
||||
f.push_back(indices[i][3]);
|
||||
f.push_back(indices[i][0]);
|
||||
f.push_back(indices[i][1]);
|
||||
}
|
||||
if (j == 2)
|
||||
{
|
||||
f.push_back(indices[i][3]);
|
||||
f.push_back(indices[i][1]);
|
||||
f.push_back(indices[i][2]);
|
||||
}
|
||||
if (j == 3)
|
||||
{
|
||||
f.push_back(indices[i][2]);
|
||||
f.push_back(indices[i][0]);
|
||||
f.push_back(indices[i][3]);
|
||||
}
|
||||
std::vector<int> f_sorted = f;
|
||||
std::sort(f_sorted.begin(), f_sorted.end());
|
||||
if (dict.find(f_sorted) != dict.end())
|
||||
{
|
||||
dict.erase(f_sorted);
|
||||
}
|
||||
else
|
||||
{
|
||||
dict.insert(std::make_pair(f_sorted, f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto it = dict.begin(); it != dict.end(); ++it)
|
||||
{
|
||||
std::vector<int> f = it->second;
|
||||
psb->appendFace(f[0], f[1], f[2]);
|
||||
}
|
||||
}
|
||||
|
||||
void btSoftBodyHelpers::writeObj(const char* filename, const btSoftBody* psb)
|
||||
{
|
||||
std::ofstream fs;
|
||||
|
||||
@@ -151,6 +151,9 @@ struct btSoftBodyHelpers
|
||||
static void readRenderMeshFromObj(const char* file, btSoftBody* psb);
|
||||
|
||||
static void interpolateBarycentricWeights(btSoftBody* psb);
|
||||
|
||||
static void generateBoundaryFaces(btSoftBody* psb);
|
||||
|
||||
static void duplicateFaces(const char* filename, const btSoftBody* psb);
|
||||
/// Sort the list of links to move link calculations that are dependent upon earlier
|
||||
/// ones as far as possible away from the calculation of those values
|
||||
|
||||
Reference in New Issue
Block a user