+ hook up a few more parameters, that can be useful for Bullet soft bodies

+ work-in-progress to hook up cluster constraints (they are better than node/vertex pinning, because they maintain a proper world coordinate system)
This commit is contained in:
Erwin Coumans 2008-10-01 06:36:17 +00:00
parent e427b82962
commit aa5c4f8801
2 changed files with 124 additions and 22 deletions

@ -3006,7 +3006,7 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
xco = 0; xco = 0;
uiDefButF(block, NUMSLI, 0, "LinStiff", xco, yco, 238, 19, uiDefButF(block, NUMSLI, 0, "LinStiff", xco, yco, 238, 19,
&ob->bsoft->linStiff, 0.0, 1.0, 1, 0, &ob->bsoft->linStiff, 0.0, 1.0, 1, 0,
"Linear stiffness of the soft body vertex spring"); "Linear stiffness of the soft body links");
yco -= 25; yco -= 25;
xco = 0; xco = 0;
@ -3027,9 +3027,35 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
xco+=120, yco, 118, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0, xco+=120, yco, 118, 19, &ob->bsoft->collisionflags, 0, 0, 0, 0,
"Enable cluster collision between soft and soft body"); "Enable cluster collision between soft and soft body");
yco -= 25; yco -= 25;
xco = 0;
uiDefButI(block, NUM, REDRAWVIEW3D, "Clus.It.",
xco, yco, 118, 19, &ob->bsoft->numclusteriterations, 1.0, 128.,
0, 0, "Specify the number of cluster iterations");
uiDefButI(block, NUM, REDRAWVIEW3D, "piterations",
xco+=120, yco, 118, 19, &ob->bsoft->piterations, 0, 10,
0, 0, "Position solver iterations");
yco -= 25;
xco = 0;
uiDefButF(block, NUMSLI, REDRAWVIEW3D, "Friction",
xco, yco, 118, 19, &ob->bsoft->kDF, 0.0, 1.,
0, 0, "Dynamic Friction");
uiDefButF(block, NUMSLI, REDRAWVIEW3D, "kMT",
xco+=120, yco, 118, 19, &ob->bsoft->kMT, 0, 1,
0, 0, "Pose matching coefficient");
/*
//too complex tweaking, disable for now
uiDefButF(block, NUMSLI, REDRAWVIEW3D, "kVC",
xco+=80, yco, 80, 19, &ob->bsoft->kVC, 0, 100,
0, 0, "Volume coefficient");
*/
xco = 0; xco = 0;
/* /*
//would be a cool option, like leaves in the wind, need complex tweaking
uiDefButBitI(block, TOG, OB_BSB_AERO_VTWOSIDE, 0, "Aero model", uiDefButBitI(block, TOG, OB_BSB_AERO_VTWOSIDE, 0, "Aero model",
xco, yco, 118, 19, &ob->bsoft->flag, 0, 0, 0, 0, xco, yco, 118, 19, &ob->bsoft->flag, 0, 0, 0, 0,
"Enable aero model, vertex normals are flipped to match velocity"); "Enable aero model, vertex normals are flipped to match velocity");
@ -3037,18 +3063,6 @@ static uiBlock *advanced_bullet_menu(void *arg_ob)
yco -= 25; yco -= 25;
*/ */
/*
uiDefButF(block, NUMSLI, 0, "AngStiff ", xco, yco, 238, 19,
&ob->bsoft->angStiff, 0.0, 1.0, 1, 0,
"Angular stiffness of the soft body vertex spring");
yco -= 25;
uiDefButF(block, NUMSLI, 0, "Volume ", xco, yco, 238, 19,
&ob->bsoft->volume, 0.0, 1.0, 1, 0,
"Factor of soft body volume preservation");
*/
} }
} else } else

@ -1531,6 +1531,46 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
btVector3 pivotPointSoftWorld = sb0->m_initialWorldTransform(pivotInA); btVector3 pivotPointSoftWorld = sb0->m_initialWorldTransform(pivotInA);
int node=findClosestNode(sb0,pivotPointSoftWorld); int node=findClosestNode(sb0,pivotPointSoftWorld);
if (node >=0) if (node >=0)
{
bool clusterconstaint = false;
/*
switch (type)
{
case PHY_LINEHINGE_CONSTRAINT:
{
if (sb0->clusterCount() && rb1)
{
btSoftBody::LJoint::Specs ls;
ls.erp=0.5f;
ls.position=sb0->clusterCom(0);
sb0->appendLinearJoint(ls,rb1);
clusterconstaint = true;
break;
}
}
case PHY_GENERIC_6DOF_CONSTRAINT:
{
if (sb0->clusterCount() && rb1)
{
btSoftBody::AJoint::Specs as;
as.erp = 1;
as.cfm = 1;
as.axis.setValue(axisX,axisY,axisZ);
sb0->appendAngularJoint(as,rb1);
clusterconstaint = true;
break;
}
break;
}
default:
{
}
};
*/
if (!clusterconstaint)
{ {
if (rb1) if (rb1)
{ {
@ -1540,6 +1580,9 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
sb0->setMass(node,0.f); sb0->setMass(node,0.f);
} }
} }
}
return 0;//can't remove soft body anchors yet return 0;//can't remove soft body anchors yet
} }
@ -1548,6 +1591,48 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
btVector3 pivotPointAWorld = colObj0->getWorldTransform()(pivotInA); btVector3 pivotPointAWorld = colObj0->getWorldTransform()(pivotInA);
int node=findClosestNode(sb1,pivotPointAWorld); int node=findClosestNode(sb1,pivotPointAWorld);
if (node >=0) if (node >=0)
{
bool clusterconstaint = false;
/*
switch (type)
{
case PHY_LINEHINGE_CONSTRAINT:
{
if (sb1->clusterCount() && rb0)
{
btSoftBody::LJoint::Specs ls;
ls.erp=0.5f;
ls.position=sb1->clusterCom(0);
sb1->appendLinearJoint(ls,rb0);
clusterconstaint = true;
break;
}
}
case PHY_GENERIC_6DOF_CONSTRAINT:
{
if (sb1->clusterCount() && rb0)
{
btSoftBody::AJoint::Specs as;
as.erp = 1;
as.cfm = 1;
as.axis.setValue(axisX,axisY,axisZ);
sb1->appendAngularJoint(as,rb0);
clusterconstaint = true;
break;
}
break;
}
default:
{
}
};*/
if (!clusterconstaint)
{ {
if (rb0) if (rb0)
{ {
@ -1557,6 +1642,9 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
sb1->setMass(node,0.f); sb1->setMass(node,0.f);
} }
} }
}
return 0;//can't remove soft body anchors yet return 0;//can't remove soft body anchors yet
} }