我在子弹软体模拟中有两只幼崽(我在下面制作这样一个立方体的例子)。我怎样才能约束它们,就好像这两个立方体被“粘在一起”在脸上一样?
const btVector3 c[]={
btVector3(-1,-1,-1),
btVector3(+1,-1,-1),
btVector3(-1,+1,-1),
btVector3(+1,+1,-1),
btVector3(-1,-1,+1),
btVector3(+1,-1,+1),
btVector3(-1,+1,+1),
btVector3(+1,+1,+1)
};
btSoftBody* psb=btSoftBodyHelpers::CreateFromConvexHull(pdemo->m_softBodyWorldInfo,c,8, true);
我找到了this thread,其中OP询问“单向顶点到顶点的关节”。我正在寻找一种类似(但是双向)的关节。
答案 0 :(得分:1)
两个对象之间需要什么样的交互?不同的方法可能会导致不同的结果。另外请记住,您需要一个非常高的迭代次数和较小的时间步长才能使解算器始终保持粘合的对象。
我建议您通过为节点使用不同的质量和链接的刚度值来构建单个异构的柔体。
const btVector3 c[] =
{
btVector3(+1,-1,-1),
btVector3(+1,+1,-1),
btVector3(+1,-1,+1),
btVector3(+1,+1,+1),
btVector3(-1,-1,-1),
btVector3(-1,-1,+1),
btVector3(-1,+1,+1),
btVector3(-1,+1,-1),
btVector3(+2,-1,-1), // "Other" cube starts here
btVector3(+2,+1,-1),
btVector3(+2,-1,+1),
btVector3(+2,+1,+1)
};
// Masses, should be tuned depending on gravity/timestep
const btScalar m[] =
{
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f,
0.1f
};
btSoftBody* psb = new btSoftBody(pdemo->m_softBodyWorldInfo,12,c,m);
// VERY stiff material
btSoftBody::Material aMat;
aMat.m_kLST = 1; // Linear stiffness coefficient [0,1]
aMat.m_kAST = 0; // Area/Angular stiffness coefficient [0,1]
aMat.m_kVST = 1; // Volume stiffness coefficient [0,1]
// Softer material
btSoftBody::Material bMat;
bMat.m_kLST = 0.5f; // Linear stiffness coefficient [0,1]
bMat.m_kAST = 0; // Area/Angular stiffness coefficient [0,1]
bMat.m_kVST = 0.5f; // Volume stiffness coefficient [0,1]
for(int i=0; i < 12; ++i)
{
for(int j = i + 1; j < 12; ++j)
{
// If either node has x==+2, use softer material
psb->appendLink(i,j, (i > 7 || j > 7) ? &bMat : &aMat, false);
}
}
这应该让你开始。祝你好运!