solveVelocityConstraints method

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

Implementation

@override
void solveVelocityConstraints(SolverData step) {
  var crossMassSum = 0.0;
  var dotMassSum = 0.0;

  final velocities = step.velocities;
  final positions = step.positions;
  final d = List<Vector2>.generate(
    _bodies.length,
    (i) {
      final prev = (i == 0) ? _bodies.length - 1 : i - 1;
      final next = (i == _bodies.length - 1) ? 0 : i + 1;
      final v = positions[_bodies[next].islandIndex].c -
          positions[_bodies[prev].islandIndex].c;
      dotMassSum += (v.length2) / _bodies[i].mass;
      crossMassSum += velocities[_bodies[i].islandIndex].v.cross(v);
      return v;
    },
  );
  final lambda = -2.0 * crossMassSum / dotMassSum;
  _impulse += lambda;
  for (var i = 0; i < _bodies.length; ++i) {
    velocities[_bodies[i].islandIndex].v.x +=
        _bodies[i].inverseMass * d[i].y * .5 * lambda;
    velocities[_bodies[i].islandIndex].v.y +=
        _bodies[i].inverseMass * -d[i].x * .5 * lambda;
  }
}