clipAgainstHull method

void clipAgainstHull(
  1. Vec3 posA,
  2. Quaternion quatA,
  3. ConvexPolyhedron hullB,
  4. Vec3 posB,
  5. Quaternion quatB,
  6. Vec3 separatingNormal,
  7. double minDist,
  8. double maxDist,
  9. List<ConvexPolyhedronContactPoint> result,
)

@param minDist Clamp distance @param result The an array of contact point objects, see clipFaceAgainstHull

Implementation

void clipAgainstHull(
  final Vec3 posA,
  final Quaternion quatA,
  final ConvexPolyhedron hullB ,
  final Vec3 posB,
  final Quaternion quatB,
  final Vec3 separatingNormal,
  final double minDist,
  final double maxDist,
  final List<ConvexPolyhedronContactPoint> result
) {
  final worldNormal = Vec3();
  int closestFaceB = -1;
  double dmax = -double.infinity;
  for (int face = 0; face < hullB.faces.length; face++) {
    worldNormal.copy(hullB.faceNormals[face]!);
    quatB.vmult(worldNormal, worldNormal);
    final double d = worldNormal.dot(separatingNormal);
    if (d > dmax) {
      dmax = d;
      closestFaceB = face;
    }
  }

  List<Vec3> worldVertsB1 = [];
  int len = hullB.faces.isEmpty?0:hullB.faces[closestFaceB].length;
  for (int i = 0; i < len; i++) {
    final b = hullB.vertices[hullB.faces[closestFaceB][i]];
    final worldb = Vec3();
    worldb.copy(b);
    quatB.vmult(worldb, worldb);
    posB.vadd(worldb, worldb);
    worldVertsB1.add(worldb);
  }

  if (closestFaceB >= 0) {
    clipFaceAgainstHull(separatingNormal, posA, quatA, worldVertsB1, minDist, maxDist, result);
  }
}