public override void MoveCamera(float zoomValue)
        {
            PlacementRelativeModel placement = this.GetPlacementRelativeModel();

            base.MoveCamera(zoomValue);
            _desiredDistanceToModelCenter = (_modelPosition - transform.position).magnitude;
            this.CorrectTransformByModelBounds(placement);
        }
        PlacementRelativeModel GetPlacementRelativeModel()
        {
            PlacementRelativeModel result  = new PlacementRelativeModel();
            Vector3 directionToModelCenter = _modelPosition - transform.position;

            result.isXPositive = directionToModelCenter.x < 0;
            result.isYPositive = directionToModelCenter.y < 0;
            result.isZPositive = directionToModelCenter.z < 0;
            return(result);
        }
        void CorrectTransformByModelBounds(PlacementRelativeModel placement)
        {
            Vector3 cameraDirection = (this.Target - transform.position).normalized;

            if (!_collisionsDetector.IsPointInModel(transform.position))
            {
                float distanceToTarget = (this.Target - transform.position).magnitude;
                float delta            = distanceToTarget - _desiredDistanceToModelCenter;
                if (delta > 0)
                {
                    transform.position += cameraDirection * delta;
                }
            }

            float step = 0.005f;

            while (_collisionsDetector.IsPointInModel(transform.position))
            {
                transform.position += -cameraDirection * step;
            }
            transform.LookAt(this.Target);
        }