/// <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 }
public Vector3 MoveCameraInterpolated(Vector3 desiredPos, float horizontalMoveSpeed, float verticalMoveSpeed, float deltaTime) { return(Lerps.Smootherstep(cam.transform.position, desiredPos, horizontalMoveSpeed * deltaTime, verticalMoveSpeed * deltaTime)); }