private void LateUpdate()
        {
            gravityAlignment = Quaternion.FromToRotation(
                gravityAlignment * Vector3.up, CustomGravity.GetUpAxis(focusPoint)) * gravityAlignment;

            UpdateFocusPoint();
            ManualRotation();

            if (ManualRotation() || AutomaticRotation())
            {
                ConstrainAngles();
                orbitRotation = Quaternion.Euler(orbitAngles);
            }

            Quaternion lookRotation = gravityAlignment * orbitRotation;

            Vector3 lookDirection = lookRotation * Vector3.forward;
            Vector3 lookPosition  = focusPoint - lookDirection * distance;


            Vector3 rectOffset    = lookDirection * regularCamera.nearClipPlane;
            Vector3 rectPosition  = lookPosition + rectOffset;
            Vector3 castFrom      = focus.position;
            Vector3 castLine      = rectPosition - castFrom;
            float   castDistance  = castLine.magnitude;
            Vector3 castDirection = castLine / castDistance;

            if (Physics.BoxCast(
                    castFrom, CameraHalfExtends, castDirection, out RaycastHit hit,
                    lookRotation, castDistance, obstructionMask))
            {
                rectPosition = castFrom + castDirection * hit.distance;
                lookPosition = rectPosition - rectOffset;
            }

            transform.SetPositionAndRotation(lookPosition, lookRotation);
        }