I compute the Jacobian of friction ,I have to compute the friction Direction Dk whick store in cp.m_lateralFrictionDir1.
But it's not clear about why compute this way below
Code: Select all
btVector3 tbRigidBody::getVelocityInLocalPoint(const btVector3& rel_pos) const
{
	//we also calculate lin/ang velocity for kinematic objects
	return m_linearVelocity + m_angularVelocity.cross(rel_pos);
	//for kinematic objects, we could also use use:
	//		return 	(m_worldTransform(rel_pos) - m_interpolationWorldTransform(rel_pos)) / m_kinematicTimeStep;
}
/////setup the friction constraints
btVector3 vel1 = rb0 ? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0,0,0);
btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
vel  = vel1 - vel2;
rel_vel = cp.m_normalWorldOnB.dot(vel);
{
   btVector3 frictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
   btScalar lat_rel_vel = frictionDir1.length2();
   if (lat_rel_vel > SIMD_EPSILON)//0.0f)
   {
      //use projected normal direction as first friction direction and cross product of normal and frictionDir1 as second friction direction
      frictionDir1 /= btSqrt(lat_rel_vel);
      addFrictionConstraint(frictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
      btVector3 frictionDir2 = frictionDir1.cross(cp.m_normalWorldOnB);
      frictionDir2.normalize();
      addFrictionConstraint(frictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
   } else
   {
      //calculate two orthogonal vectors to normal direction
      //re-calculate friction direction every frame, todo: check if this is really needed
      btVector3   frictionDir1,frictionDir2;
      btPlaneSpace1(cp.m_normalWorldOnB,frictionDir1,frictionDir2);
      addFrictionConstraint(frictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
      addFrictionConstraint(frictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
   }
}