solveViscous method

void solveViscous(
  1. TimeStep step
)

Implementation

void solveViscous(TimeStep step) {
  for (final contact in bodyContactBuffer) {
    final particle = contact.particle;
    if ((particle.flags & ParticleType.viscousParticle) != 0) {
      final b = contact.body;
      final w = contact.weight;
      final m = contact.mass;
      final p = particle.position;
      final va = particle.velocity;
      final tempX = p.x - b.sweep.c.x;
      final tempY = p.y - b.sweep.c.y;
      final vx = -b.angularVelocity * tempY + b.linearVelocity.x - va.x;
      final vy = b.angularVelocity * tempX + b.linearVelocity.y - va.y;
      final f = _tempVec;
      final pInvMass = particleInverseMass;
      f.x = viscousStrength * m * w * vx;
      f.y = viscousStrength * m * w * vy;
      va.x += pInvMass * f.x;
      va.y += pInvMass * f.y;
      f.x = -f.x;
      f.y = -f.y;
      b.applyLinearImpulse(f, point: p);
    }
  }
  for (final contact in contactBuffer) {
    if ((contact.flags & ParticleType.viscousParticle) != 0) {
      final particleA = contact.particleA;
      final particleB = contact.particleB;
      final w = contact.weight;
      final va = particleA.velocity;
      final vb = particleB.velocity;
      final vx = vb.x - va.x;
      final vy = vb.y - va.y;
      final fx = viscousStrength * w * vx;
      final fy = viscousStrength * w * vy;
      va.x += fx;
      va.y += fy;
      vb.x -= fx;
      vb.y -= fy;
    }
  }
}