31 btVector3 va(0, 0, 0);
32 if (cti.
m_colObj->hasContactResponse())
38 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
43 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
48 const int ndof = multibodyLinkCol->
m_multiBody->getNumDofs() + 6;
56 for (
int k = 0; k < ndof; ++k)
58 vel += (local_v[k] + local_dv[k]) * J_n[k];
63 for (
int k = 0; k < ndof; ++k)
65 vel += (local_v[k] + local_dv[k]) * J_t1[k];
69 for (
int k = 0; k < ndof; ++k)
71 vel += (local_v[k] + local_dv[k]) * J_t2[k];
83 btVector3 va =
getVa();
84 btVector3 vb =
getVb();
85 btVector3 vr = (vb - va);
95 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
104 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
108 if (multibodyLinkCol)
112 multibodyLinkCol->
m_multiBody->applyDeltaVeeMultiDof2(deltaV_normal, impulse.dot(cti.
m_normal));
120 return residualSquare;
147 : m_contact(other.m_contact),
btDeformableContactConstraint(other), m_penetration(other.m_penetration), m_total_split_impulse(other.m_total_split_impulse), m_binding(other.m_binding)
156 btVector3 va(0, 0, 0);
157 if (cti.
m_colObj->hasContactResponse())
163 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
168 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
171 if (multibodyLinkCol)
173 const int ndof = multibodyLinkCol->
m_multiBody->getNumDofs() + 6;
181 for (
int k = 0; k < ndof; ++k)
183 vel += (local_v[k] + local_dv[k]) * J_n[k];
188 for (
int k = 0; k < ndof; ++k)
190 vel += (local_v[k] + local_dv[k]) * J_t1[k];
194 for (
int k = 0; k < ndof; ++k)
196 vel += (local_v[k] + local_dv[k]) * J_t2[k];
208 btVector3 va(0, 0, 0);
209 if (cti.
m_colObj->hasContactResponse())
215 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
220 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
223 if (multibodyLinkCol)
225 const int ndof = multibodyLinkCol->
m_multiBody->getNumDofs() + 6;
232 for (
int k = 0; k < ndof; ++k)
234 vel += local_split_v[k] * J_n[k];
239 for (
int k = 0; k < ndof; ++k)
241 vel += local_split_v[k] * J_t1[k];
245 for (
int k = 0; k < ndof; ++k)
247 vel += local_split_v[k] * J_t2[k];
259 btVector3 va =
getVa();
260 btVector3 vb =
getVb();
261 btVector3 vr = vb - va;
278 btVector3 impulse_tangent = impulse - impulse_normal;
295 impulse_tangent.setZero();
321 impulse = impulse_normal + impulse_tangent;
325 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
334 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
338 if (multibodyLinkCol)
342 multibodyLinkCol->
m_multiBody->applyDeltaVeeMultiDof2(deltaV_normal, impulse.dot(cti.
m_normal));
353 return residualSquare;
367 btVector3 vr = vb - va;
388 if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_RIGID_BODY)
397 else if (cti.
m_colObj->getInternalType() == btCollisionObject::CO_FEATHERSTONE_LINK)
401 if (multibodyLinkCol)
405 multibodyLinkCol->
m_multiBody->applyDeltaSplitVeeMultiDof(deltaV_normal, impulse.dot(cti.
m_normal));
408 return residualSquare;
439 btVector3 dv = contact->
m_c5 * impulse;
446 btVector3 dv = contact->
m_c5 * impulse;
487 btVector3 dv = impulse * contact->
m_c2;
490 btVector3& v0 = face->
m_n[0]->
m_v;
491 btVector3& v1 = face->m_n[1]->m_v;
492 btVector3&
v2 = face->m_n[2]->m_v;
493 const btScalar& im0 = face->m_n[0]->m_im;
494 const btScalar& im1 = face->m_n[1]->m_im;
495 const btScalar& im2 = face->m_n[2]->m_im;
505 btScalar m01 = (relaxation / (im0 + im1));
506 btScalar m02 = (relaxation / (im0 + im2));
507 btScalar m12 = (relaxation / (im1 + im2));
508#ifdef USE_STRAIN_RATE_LIMITING
511 btVector3& x0 = face->m_n[0]->m_x;
512 btVector3& x1 = face->m_n[1]->m_x;
513 btVector3& x2 = face->m_n[2]->m_x;
514 const btVector3 x_diff[3] = {x1 - x0, x2 - x0, x2 - x1};
515 const btVector3 v_diff[3] = {v1 - v0,
v2 - v0,
v2 - v1};
519 for (
int i = 0; i < 3; ++i)
521 btScalar x_diff_norm = x_diff[i].safeNorm();
523 btScalar strainRate = x_diff_norm_new / x_diff_norm;
525 u[i].safeNormalize();
526 if (x_diff_norm == 0 || (1 - p <= strainRate && strainRate <= 1 + p))
531 x_diff_dot_u =
btDot(x_diff[i], u[i]);
533 if (1 - p > strainRate)
535 s = 1 / dt * (-x_diff_dot_u -
btSqrt(x_diff_dot_u * x_diff_dot_u + (p * p - 2 * p) * x_diff_norm * x_diff_norm));
539 s = 1 / dt * (-x_diff_dot_u +
btSqrt(x_diff_dot_u * x_diff_dot_u + (p * p + 2 * p) * x_diff_norm * x_diff_norm));
543 dn[i] = s - v_diff[i].safeNorm();
545 btVector3 dv0 = im0 * (m01 * u[0] * (-dn[0]) + m02 * u[1] * -(dn[1]));
546 btVector3 dv1 = im1 * (m01 * u[0] * (dn[0]) + m12 * u[2] * (-dn[2]));
547 btVector3 dv2 = im2 * (m12 * u[2] * (dn[2]) + m02 * u[1] * (dn[1]));
550 btVector3 dv0 = im0 * (m01 * (v1 - v0) + m02 * (
v2 - v0));
551 btVector3 dv1 = im1 * (m01 * (v0 - v1) + m12 * (
v2 - v1));
552 btVector3 dv2 = im2 * (m12 * (v1 -
v2) + m02 * (v0 -
v2));
570 btVector3 dv = impulse * contact->
m_c2;
573 btVector3& v1 = face->m_n[1]->m_splitv;
574 btVector3&
v2 = face->m_n[2]->m_splitv;
575 const btScalar& im0 = face->m_n[0]->m_im;
576 const btScalar& im1 = face->m_n[1]->m_im;
577 const btScalar& im2 = face->m_n[2]->m_im;
632 btVector3 va =
getVa();
633 btVector3 vb =
getVb();
634 btVector3 vr = vb - va;
640 btVector3 impulse_tangent = impulse - impulse_normal;
660 impulse_tangent.setZero();
685 impulse = impulse_normal + impulse_tangent;
688 return residualSquare;
694 btVector3 dva = impulse * contact->
m_node->
m_im;
695 btVector3 dvb = impulse * contact->
m_imf;
702 btVector3& v0 = face->
m_n[0]->
m_v;
703 btVector3& v1 = face->m_n[1]->m_v;
704 btVector3&
v2 = face->m_n[2]->m_v;
705 const btScalar& im0 = face->m_n[0]->m_im;
706 const btScalar& im1 = face->m_n[1]->m_im;
707 const btScalar& im2 = face->m_n[2]->m_im;
ATTR_WARN_UNUSED_RESULT const BMVert * v2
struct btDbvtNode * m_node
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint int const btContactSolverInfo & infoGlobal
SIMD_FORCE_INLINE btScalar safeNorm() const
Return the norm (length) of the vector.
SIMD_FORCE_INLINE btScalar btDot(const btVector3 &v1, const btVector3 &v2)
Return the dot product between two vectors.
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
static btMultiBodyLinkCollider * upcast(btCollisionObject *colObj)
btMultiBody * m_multiBody
btVector3 getVelocityInLocalPoint(const btVector3 &rel_pos) const
void applyImpulse(const btVector3 &impulse, const btVector3 &rel_pos)
btVector3 getPushVelocityInLocalPoint(const btVector3 &rel_pos) const
void applyPushImpulse(const btVector3 &impulse, const btVector3 &rel_pos)
static const btRigidBody * upcast(const btCollisionObject *colObj)
btMultiBodyJacobianData jacobianData_t1
btMultiBodyJacobianData jacobianData_normal
btMultiBodyJacobianData jacobianData_t2
btAlignedObjectArray< btScalar > m_deltaVelocitiesUnitImpulse
btAlignedObjectArray< btScalar > m_jacobians
const btCollisionObject * m_colObj