Unity相机围绕对象旋转到平滑停止



我有一个脚本,使我的相机围绕目标旋转时,右键单击。目前,当释放右键时,旋转完全停止,这是完全预期的行为。我想让它在鼠标按下之后,在完全停止之前继续旋转一段时间,就像它在减速一样。下面是处理给定目标周围旋转的代码:

if (!target)
return;
if (Input.GetMouseButtonDown(1))
previousPosition = cam.ScreenToViewportPoint(Input.mousePosition);
if (Input.GetMouseButton(1))
{
Vector3 nextDirection = previousPosition - cam.ScreenToViewportPoint(Input.mousePosition);
direction = Vector3.SmoothDamp(direction, nextDirection, ref smoothVelocity, smoothTime);
cam.transform.position = target.position;
cam.transform.Rotate(new Vector3(1, 0, 0), direction.y * 180);
cam.transform.Rotate(new Vector3(0, 1, 0), -direction.x * 180, Space.World);
cam.transform.Translate(new Vector3(0, 0, -distanceFromSphere));
previousPosition = cam.ScreenToViewportPoint(Input.mousePosition);
}

下面是需要的引用:

public Camera cam;
public Vector3 previousPosition;
public Transform target;
public float distanceFromSphere = 100;
public Vector3 direction;
public Vector3 smoothVelocity = Vector3.zero;
public float smoothTime = 3f;

是否有办法使摄像机旋转在鼠标按下时加速,鼠标按上时减速?

你需要的是惯性,在if语句之外获得Rotate和Translate调用,并在最后将方向乘以0.98或0.99,这取决于你需要多少惯性。

public float inertia = 0.98f;

direction *= inertia;

Chris Ch的解决方案很好,但我已经做了一些不同的事情,以下是我对原始问题的解决方案:

void UpdateWorldRotation()
{
if (!target)
return;
if (Input.GetMouseButtonDown(1))
previousPosition = cam.ScreenToViewportPoint(Input.mousePosition);
Vector3 currentSmoothVelocity = new Vector3();
if (Input.GetMouseButton(1))
{
nextDirection = previousPosition - cam.ScreenToViewportPoint(Input.mousePosition);
currentSmoothVelocity = smoothVelocity;
}
if (Input.GetMouseButtonUp(1))
{
StartCoroutine(SmoothStop());
currentSmoothVelocity = smoothVelocity / 2;
}
direction = Vector3.SmoothDamp(direction, nextDirection, ref currentSmoothVelocity, smoothTime, 100, 10f * Time.deltaTime);
cam.transform.position = target.position;
cam.transform.Rotate(new Vector3(1, 0, 0), direction.y * 180);
cam.transform.Rotate(new Vector3(0, 1, 0), -direction.x * 180, Space.World);
cam.transform.Translate(new Vector3(0, 0, -distanceFromSphere));
previousPosition = cam.ScreenToViewportPoint(Input.mousePosition);
}
IEnumerator SmoothStop()
{
yield return new WaitForSeconds(smoothStopTime);
nextDirection = Vector3.zero;
}

这样,球体在完全停止之前以较慢的速度旋转一段特定的时间。

最新更新