- Home /
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.
Answer by Kossuranta · Apr 03, 2017 at 11:30 AM
Save original rotation
Create new float t
Set value of t to 0 on Input.GetMouseButtonUp(0)
On !Input.GetMouseButton(0) then t += Time.deltaTime
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.
Thank you so much for the reply. I have tried this, but don't understand, how do I get the start rotation? (I have tried startRot = transform;) sorry I'm such a noob.
@VeeooshL you can get rotation by simply writing this " Quaternion startRot = transform.rotation "
I have tried this, and it works really well, but does not account for the position of the camera, as it orbits an object. when I release the mouse button, it rotates smoothly back to the direction it was facing, but does not rotate around my target. :( thanks so much though.
Your answer
![](https://koobas.hobune.stream/wayback/20220612114431im_/https://answers.unity.com/themes/thub/images/avi.jpg)