private float[] TargetProjectionHits(Vector3 target, ProjectionEdgeHits alongAxis, float projectionPlaneDistance, float halfFovRad) { float distanceFromProjectionPlane = projectionPlaneDistance - target.z; float projectionHalfSpan = Mathf.Tan(halfFovRad) * distanceFromProjectionPlane; if (alongAxis == ProjectionEdgeHits.LEFT_RIGHT) { return(new[] { target.x + projectionHalfSpan, target.x - projectionHalfSpan }); } else { return(new[] { target.y + projectionHalfSpan, target.y - projectionHalfSpan }); } }
private ProjectionHits ViewProjectionEdgeHits(IEnumerable <Vector3> targetsRotatedToCameraIdentity, ProjectionEdgeHits alongAxis, float projectionPlaneZ, float halfFovRad) { float[] projectionHits = targetsRotatedToCameraIdentity .SelectMany(target => TargetProjectionHits(target, alongAxis, projectionPlaneZ, halfFovRad)) .ToArray(); return(new ProjectionHits(projectionHits.Max(), projectionHits.Min())); }