separation static method

Vector3 separation(
  1. Vector3 currentPos,
  2. Vector3 currentVel,
  3. List<Vector3> neighbors, {
  4. double desiredDistance = 2.0,
  5. double maxSpeed = 5.0,
  6. double maxForce = 10.0,
})

Computes a separation steering force avoiding crowding nearby neighbors.

Implementation

static vm.Vector3 separation(
  vm.Vector3 currentPos,
  vm.Vector3 currentVel,
  List<vm.Vector3> neighbors, {
  double desiredDistance = 2.0,
  double maxSpeed = 5.0,
  double maxForce = 10.0,
}) {
  var pushDir = vm.Vector3.zero();
  var count = 0;

  for (final other in neighbors) {
    final diff = currentPos - other;
    final dist = diff.length;
    if (dist > 0.001 && dist < desiredDistance) {
      pushDir += diff.normalized() / dist;
      count++;
    }
  }

  if (count == 0) return vm.Vector3.zero();
  pushDir /= count.toDouble();
  if (pushDir.length2 == 0) return vm.Vector3.zero();

  final desiredVel = pushDir.normalized() * maxSpeed;
  final force = desiredVel - currentVel;
  return truncate(force, maxForce);
}