public Vector3 GetTargetFollowPosition(float deltaTime, float virtualCameraSphereRadius)
        {
            //get desired offset based on whether target is moving towards or away from camera. If we add more camera-target orientation states,
            //will need to do this a better way
            Vector3 desiredOffset;
            float   followSpeedHorz;
            float   followSpeedVert;
            float   followSpeedDistance;

            if (stateController.GetOrientationState() == CameraTargetOrientationState.TowardsCamera && camParams.allowMoveTowardsCamera)
            {
                desiredOffset       = camParams.desiredFrontOffset;
                followSpeedHorz     = camParams.frontFollowSpeedOrientation;
                followSpeedVert     = camParams.frontFollowSpeedHeight;
                followSpeedDistance = camParams.frontFollowSpeedDistance;
            }
            else //moving away from camera
            {
                desiredOffset       = camParams.desiredOffset;
                followSpeedHorz     = camParams.followSpeedOrientation;
                followSpeedVert     = camParams.followSpeedHeight;
                followSpeedDistance = camParams.followSpeedDistance;
            }

            //get desired height offset based on follow height mode
            if (camParams.followHeightMode == FollowHeightMode.AboveGround)
            {
                desiredOffset.y = GetDesiredHeightAboveGroundOffset(virtualCameraSphereRadius);
            }

            //get desired position from offset
            Vector3 desiredPos = GetDesiredFollowPositionWorld(desiredOffset);

            //shorten follow distance if necessary
            desiredPos = occlusionAvoidance.ShortenFollowDistanceToAvoidRearOcclusion(desiredPos, virtualCameraSphereRadius);

            //increase follow speed if avoiding occlusion
            if (camParams.avoidFollowTargetOcclusion)
            {
                float occlusionSpeedIncrease = occlusionAvoidance.GetOcclusionFollowSpeedIncrease();
                followSpeedHorz += occlusionSpeedIncrease;
                followSpeedVert += occlusionSpeedIncrease;
            }
            //interpolate between current and desired positions
            Vector3 newCamPos = locomotion.MoveCameraInterpolated(desiredPos, followSpeedHorz, followSpeedVert, deltaTime);

            //interpolate distance from target separately
            float   desiredDistance = desiredOffset.magnitude;
            Vector3 newOffset       = newCamPos - followTarget.transform.position;                                               //convert new cam position back to a world space offset from follow target
            float   newDistance     = Lerps.Smootherstep(newOffset.magnitude, desiredDistance, followSpeedDistance * deltaTime); //interpolate between current offset distance and desired distance

            return(followTarget.transform.position + (newOffset.normalized * newDistance));                                      //scale normalised offset by new distance and convert back to world position
        }
Exemplo n.º 2
0
 // Update is called once per frame
 void Update()
 {
     headerText.text   = "Camera: " + cam.name;
     positionText.text = "Position: " + cam.transform.position.ToString();
     stateText.text    = "State: " + stateController.GetCameraState().ToString() + ", " + stateController.GetOrientationState();
     orbitText.text    = "Orbit input: " + camInput.GetOrbitInput().ToString();
 }