Sorry in advance for my bad level in english :/
I have the same issue as the one on this topic :
2D physics engine: Impulse based collision response with contact point manifold
I must separate linear and angular impulse resolution, else I don’t have bounce with 2 contacts point. I don’t understand why because I am using the same way like Matter.js
public void SolveVelocity(Pair _pair)
{
if (!_pair.tk_isActive)
return;
Vector3 rpA_;
Vector3 rpB_;
//Normal Impulse
float linearImpulse_X;
float linearImpulse_Y;
float angularImpulse_X;
float angularImpulse_Y;
//tangent Impulse
float tangentLinearImpulse_X = 0;
float tangentLinearImpulse_Y = 0;
float tangentAngularImpulse_X = 0;
float tangentAngularImpulse_Y = 0;
Vector3 tangent;
Vector3 _normal = _pair.tk_normal;
int _count = _pair.tk_count;
float J_Scalar;
float JT_Scalar;
float _miA = _pair.tk_bodyA.massI_;
float _miB = _pair.tk_bodyB.massI_;
float _iA = _pair.tk_bodyA.inertiaI_;
float _iB = _pair.tk_bodyB.inertiaI_;
float rv;
float _uS = (float)Math.Sqrt(_pair.tk_bodyA.uS_ * _pair.tk_bodyA.uS_ + _pair.tk_bodyB.uS_ * _pair.tk_bodyB.uS_);
float _uC = (_pair.tk_bodyA.uC_ * _pair.tk_bodyA.uC_ + _pair.tk_bodyB.uC_ * _pair.tk_bodyB.uC_)/2.0f;
float _elasticity = (_pair.tk_bodyA.tk_elasticity + _pair.tk_bodyB.tk_elasticity) / 2.0f;
Vector3 _positionA = _pair.tk_bodyA.position_;
Vector3 _positionB = _pair.tk_bodyB.position_;
Vector3 _velocityA = _pair.tk_bodyA.velocity_;
float _omegaA = _pair.tk_bodyA.omega_;
Vector3 _velocityB = _pair.tk_bodyB.velocity_;
float _omegaB = _pair.tk_bodyB.omega_;
for (int c = 0; c < _count; c++)
{
rpA_ = _pair.tk_contacts(c).tk_position - _positionA;
rpB_ = _pair.tk_contacts(c).tk_position - _positionB;
Vector3 _relativeVelocity = (_velocityB + new Vector3(rpB_.Y * -_omegaB, rpB_.X * _omegaB, 0)) -
(_velocityA + new Vector3(rpA_.Y * -_omegaA, rpA_.X * _omegaA, 0));
float _countInv = 1.0f / (_count);
float _relativeNormalVelocity = _relativeVelocity.X * _normal.X + _relativeVelocity.Y * _normal.Y;
rv = _relativeNormalVelocity;
#region Normal
J_Scalar = (1 + _elasticity) * _relativeNormalVelocity;// * _count*_count
float crossNA = (rpA_.X * _normal.Y) - (rpA_.Y * _normal.X);
float crossNB = (rpB_.X * _normal.Y) - (rpB_.Y * _normal.X);
float _crossASqr = crossNA * crossNA * _iA;
float _crossBSqr = crossNB * crossNB * _iB;
float invSum = _miA + _miB + _crossASqr + _crossBSqr;
float invShareSum = _countInv / invSum;
float J = J_Scalar * invShareSum;
if(rv > 0)
{
_pair.tk_contacts(c).tk_normalImpulse = 0;
}
else
{
var contactNormalImpulse = _pair.tk_contacts(c).tk_normalImpulse;
_pair.tk_contacts(c).tk_normalImpulse = _pair.tk_contacts(c).tk_normalImpulse + J;
if (_pair.tk_contacts(c).tk_normalImpulse < 0)
_pair.tk_contacts(c).tk_normalImpulse = 0;
J = _pair.tk_contacts(c).tk_normalImpulse - contactNormalImpulse;
}
/* if(contactNormalImpulse !=0)
{
int i = 0;
J += i;
}*/
linearImpulse_X = (J) * _normal.X;
linearImpulse_Y = (J) * _normal.Y;
angularImpulse_X = (J) * _normal.X;
angularImpulse_Y = (J) * _normal.Y;
#endregion
#region Impulse
//if (rv > 0)
{
Vector2 totalImpulseLinear = new Vector2(linearImpulse_X, linearImpulse_Y) + 0 * new Vector2(tangentLinearImpulse_X, tangentLinearImpulse_Y);
Vector2 totalImpulseAngular = new Vector2(angularImpulse_X, angularImpulse_Y) + 0 * new Vector2(tangentAngularImpulse_X, tangentAngularImpulse_Y);
if (!(_pair.tk_bodyA.is_Sleeping || _pair.tk_bodyA.Is_Static))
{
_pair.tk_bodyA.oldPosition_.X -= totalImpulseLinear.X * _miA;
_pair.tk_bodyA.oldPosition_.Y -= totalImpulseLinear.Y * _miA;
_pair.tk_bodyA.oldTheta_ -= (rpA_.X * totalImpulseAngular.Y - rpA_.Y * totalImpulseAngular.X) * _iA;
}
if (!(_pair.tk_bodyB.is_Sleeping || _pair.tk_bodyB.Is_Static))
{
_pair.tk_bodyB.oldPosition_.X += totalImpulseLinear.X * _miB;
_pair.tk_bodyB.oldPosition_.Y += totalImpulseLinear.Y * _miB;
_pair.tk_bodyB.oldTheta_ += (rpB_.X * totalImpulseAngular.Y - rpB_.Y * totalImpulseAngular.X) * _iB;
}
}
#endregion
}
}
Thx in advance for your advise