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