solveViscous method
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;
}
}
}