triangleCapsuleIntersect method

OctreeData? triangleCapsuleIntersect(
  1. Capsule capsule,
  2. Triangle triangle
)

Implementation

OctreeData? triangleCapsuleIntersect(Capsule capsule, Triangle triangle) {
  Vector3 point1, point2;
  Line line1, line2;

  triangle.getPlane(_plane);

  double d1 = _plane.distanceToPoint(capsule.start) - capsule.radius;
  double d2 = _plane.distanceToPoint(capsule.end) - capsule.radius;

  if(( d1 > 0 && d2 > 0 ) || ( d1 < - capsule.radius && d2 < - capsule.radius)){
    return null;
  }

  double delta = (d1 / (d1.abs() + d2.abs())).abs();
  Vector3 intersectPoint = _v1..setFrom( capsule.start )..lerp( capsule.end, delta );

  if(triangle.containsPoint( intersectPoint)){
    return OctreeData(normal: _plane.normal.clone(), point: intersectPoint.clone(), depth: math.min( d1, d2 ).toDouble().abs());
  }

  double r2 = capsule.radius * capsule.radius;

  line1 = _line1.set( capsule.start, capsule.end );

  List<List<Vector3>> lines = [
    [ triangle.a, triangle.b ],
    [ triangle.b, triangle.c ],
    [ triangle.c, triangle.a ]
  ];

  for (int i = 0; i < lines.length; i++){
    line2 = _line2.set( lines[ i ][ 0 ], lines[ i ][ 1 ] );

    List<Vector3> pt = capsule.lineLineMinimumPoints( line1, line2 );
    point1  = pt[0];
    point2 = pt[1];
    if ( point1.distanceToSquared( point2 ) < r2 ) {
      return OctreeData(normal: point1.clone()..sub( point2 )..normalize(), point: point2.clone(), depth: capsule.radius - point1.distanceTo( point2 ));
    }
  }

  return null;
}