solveVelocityConstraints method

  1. @override
void solveVelocityConstraints(
  1. SolverData data
)
override

Implementation

@override
void solveVelocityConstraints(SolverData data) {
  final vB = data.velocities[_indexB].v;
  var wB = data.velocities[_indexB].w;

  // Cdot = v + cross(w, r)
  final cDot = Vector2.zero();
  _rB.scaleOrthogonalInto(wB, cDot);
  cDot.add(vB);

  final impulse = Vector2.zero();
  final temp = Vector2.zero();

  temp
    ..setFrom(_impulse)
    ..scale(_gamma)
    ..add(_c)
    ..add(cDot)
    ..negate();
  _mass.transformed(temp, impulse);

  final oldImpulse = temp;
  oldImpulse.setFrom(_impulse);
  _impulse.add(impulse);
  final maxImpulse = data.step.dt * _maxForce;
  if (_impulse.length2 > maxImpulse * maxImpulse) {
    _impulse.scale(maxImpulse / _impulse.length);
  }
  impulse
    ..setFrom(_impulse)
    ..sub(oldImpulse);

  vB.x += _invMassB * impulse.x;
  vB.y += _invMassB * impulse.y;
  wB += _invIB * _rB.cross(impulse);

  data.velocities[_indexB].w = wB;
}