triangleCapsuleIntersect method
Implementation
OctreeData? triangleCapsuleIntersect(Capsule capsule, Triangle triangle) {
Vector3 point1, point2;
Line3 line1, line2;
triangle.getPlane( _plane );
num d1 = _plane.distanceToPoint( capsule.start ) - capsule.radius;
num d2 = _plane.distanceToPoint( capsule.end ) - capsule.radius;
if(( d1 > 0 && d2 > 0 ) || ( d1 < - capsule.radius && d2 < - capsule.radius)){
return null;
}
num delta = Math.abs( d1 / ( Math.abs( d1 ) + Math.abs( d2 ) ) );
Vector3 intersectPoint = _v1.copy( capsule.start ).lerp( capsule.end, delta );
if(triangle.containsPoint( intersectPoint)){
return OctreeData(normal: _plane.normal.clone(), point: intersectPoint.clone(), depth: Math.abs( Math.min( d1, d2 )));
}
num 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;
}