Return camera to start position smoothly

Sorry this is such a nooby question. How would I rotate back to the default rotation smoothly when I release the mouse button? I can use rotating around and rotating smoothly, but I don’t know how to do both. This is the code:

using UnityEngine;
using UnityEngine;
using System.Collections;

[AddComponentMenu("Camera-Control/Mouse drag Orbit with zoom")]
public class MouseOrbitImproved : MonoBehaviour
    public Transform target;
    public float distance = 5.0f;
    public float xSpeed = 120.0f;
    public float ySpeed = 120.0f;

    public float yMinLimit = -20f;
    public float yMaxLimit = 80f;

    public float distanceMin = .5f;
    public float distanceMax = 15f;

    public float smoothTime = 2f;

    float rotationYAxis = 0.0f;
    float rotationXAxis = 0.0f;

    float velocityX = 0.0f;
    float velocityY = 0.0f;

    public Vector3 startpos;

    // Use this for initialization
    void Start()
        startpos = transform.position;

        Vector3 angles = transform.eulerAngles;
        rotationYAxis = angles.y;
        rotationXAxis = angles.x;

        // Make the rigid body not change rotation
        if (GetComponent<Rigidbody>())
            GetComponent<Rigidbody>().freezeRotation = true;

    void LateUpdate()
        if (target)
            if (Input.GetMouseButton(0))
                velocityX += xSpeed * Input.GetAxis("Mouse X") * distance * 0.02f;
                velocityY += ySpeed * Input.GetAxis("Mouse Y") * 0.02f;

            rotationYAxis += velocityX;
            rotationXAxis -= velocityY;

            rotationXAxis = ClampAngle(rotationXAxis, yMinLimit, yMaxLimit);

            Quaternion fromRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, transform.rotation.eulerAngles.y, 0);
            Quaternion toRotation = Quaternion.Euler(rotationXAxis, rotationYAxis, 0);
            Quaternion rotation = toRotation;

            distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel") * 5, distanceMin, distanceMax);

            RaycastHit hit;
            if (Physics.Linecast(target.position, transform.position, out hit))
                distance -= hit.distance;
            Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotation * negDistance + target.position;

            transform.rotation = rotation;
            transform.position = position;

            velocityX = Mathf.Lerp(velocityX, 0, Time.deltaTime * smoothTime);
            velocityY = Mathf.Lerp(velocityY, 0, Time.deltaTime * smoothTime);


    public static float ClampAngle(float angle, float min, float max)
        if (angle < -360F)
            angle += 360F;
        if (angle > 360F)
            angle -= 360F;
        return Mathf.Clamp(angle, min, max);

Thanks, any help is appreciated.

  1. Save original rotation
  2. Create new float t
  3. Set value of t to 0 on Input.GetMouseButtonUp(0)
  4. On !Input.GetMouseButton(0) then t += Time.deltaTime
  5. Also on !Input.GetMouseButton(0) lerp rotation back to original rotation:


transform.rotation = Quaternion.Lerp(transform.rotation, origRot, t * speed);

This will slowdown when rotation is getting closer to original. If you want rotation speed to be constant, then also save transforms current rotation on Input.GetMouseButtonUp(0). And use code like this:

transform.rotation = Quaternion.Lerp(curRot, origRot, t * speed);

If the rotation doesn’t look good you can change Lerp to Slerp, which is slower but might look better.

Hi @VeeooshL can you share you code now that it works?? I’m a very beginner, need to do the exact same thing (camera back to initial position when no button is pushed)