/// <summary>Gets the new (interpolated) camera orbit position.</summary>
        /// <param name="orbitAngles">Angle to orbit</param>
        /// <param name="deltaTime"></param>
        /// <returns></returns>
        public Vector3 GetOrbitPosition(Vector3 orbitAngles, float deltaTime)
        {
            //get new camera position (this can/will change the distance from the target, but it is interpolated seperately next anyway)
            Vector3 desiredPos = GetDesiredOrbitPositionFromAngles(orbitAngles);
            Vector3 newCamPos  = locomotion.MoveCameraInterpolated(desiredPos, camParams.orbitSpeed, deltaTime);

            //interpolate distance from target separately
            Vector3 newOffset   = newCamPos - followTarget.transform.position;                                                                                                                        //convert new cam position back to a world space offset from follow target
            float   newDistance = Lerps.Smootherstep((cam.transform.position - followTarget.transform.position).magnitude, camParams.desiredOrbitDistance, camParams.orbitSpeedDistance * 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
        }
        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
        }
Пример #3
0
 public Vector3 MoveCameraInterpolated(Vector3 desiredPos, float horizontalMoveSpeed, float verticalMoveSpeed, float deltaTime)
 {
     return(Lerps.Smootherstep(cam.transform.position, desiredPos, horizontalMoveSpeed * deltaTime, verticalMoveSpeed * deltaTime));
 }