BoxSoftBody constructor

BoxSoftBody({
  1. required Vector3 halfExtents,
  2. double mass = 1,
  3. double stiffness = 100,
  4. int numOfParticles = 18,
})

Implementation

BoxSoftBody({
  required this.halfExtents,
  super.mass = 1,
  super.stiffness = 100,
  int numOfParticles = 18,
}):super(shape: ShapeType.box){
  final Vector3 size = halfExtents;
  final mass = this.mass/numOfParticles;
  double maxV = size.x+size.y+size.z;
  final Nx = ((size.x/maxV)*numOfParticles).floor();
  final Ny = ((size.y/maxV)*numOfParticles).floor();
  final Nz = ((size.z/maxV)*numOfParticles).floor();
  double dist = numOfParticles/maxV;

  for (int i = 0; i < Nx; i++) {
    for (int j = 0; j < Ny; j++) {
      for (int k = 0; k < Nz; k++) {
        // Create a new body
        final body = Body( mass: mass );
        body.addShape(Particle());
        body.position.setValues(-dist * i, dist * k + dist * Nz * 0.3 + 1, dist * j);
        body.velocity.setValues(0, 0, (sin(i * 0.1) + sin(j * 0.1)) * 30);
        particleBodies['$i $j $k'] = body;
      }
    }
  }

  for (int i = 0; i < Nx; i++) {
    for (int j = 0; j < Ny; j++) {
      for (int k = 0; k < Nz; k++) {
        // normal directions
        if (i < Nx - 1) _connect(i, j, k, i + 1, j, k);
        if (j < Ny - 1) _connect(i, j, k, i, j + 1, k);
        if (k < Nz - 1) _connect(i, j, k, i, j, k + 1);

        // Diagonals
        if (i < Nx - 1 && j < Ny - 1 && k < Nz - 1) {
          // 3d diagonals
          _connect(i, j, k, i + 1, j + 1, k + 1);
          _connect(i + 1, j, k, i, j + 1, k + 1);
          _connect(i, j + 1, k, i + 1, j, k + 1);
          _connect(i, j, k + 1, i + 1, j + 1, k);
        }

        // 2d diagonals
        if (i < Nx - 1 && j < Ny - 1) {
          _connect(i + 1, j, k, i, j + 1, k);
          _connect(i, j + 1, k, i + 1, j, k);
        }
        if (i < Nx - 1 && k < Nz - 1) {
          _connect(i + 1, j, k, i, j, k + 1);
          _connect(i, j, k + 1, i + 1, j, k);
        }
        if (j < Ny - 1 && k < Nz - 1) {
          _connect(i, j + 1, k, i, j, k + 1);
          _connect(i, j, k + 1, i, j + 1, k);
        }
      }
    }
  }
}