> 文章列表 > unity几种相机插值函数,视觉效果

unity几种相机插值函数,视觉效果

unity几种相机插值函数,视觉效果

介绍

unity几种相机插值函数,视觉效果不同


方法

这四种插值函数在视觉上会产生不同的效果,具体如下:

Vector3.Lerp:线性插值函数。
该函数会在两个点之间进行线性插值,返回一个介于两个点之间的向量。
使用该函数可以得到线性平滑的移动效果。
例如在相机跟随目标物体时,相机的移动轨迹是直线。
没有偏差或曲率,因此产生一种神秘或者简单的效果。Vector3.SmoothDamp:阻尼插值函数。
该函数会根据当前速度、目标速度和阻尼系数来计算出一个平滑的速度,然后根据该速度移动物体。
使用该函数可以得到平滑的移动效果,并且可以调整阻尼系数来控制移动的速度和平滑程度。
相对于线性插值函数,阻尼插值函数会产生更加平滑缓慢的移动效果。
因此在相机跟随目标物体时,产生一种柔和的效果,可以让玩家感觉到相机的跟随更加自然。Quaternion.Slerp:四元数插值函数。
该函数会在两个四元数之间进行球形插值,返回一个介于两个四元数之间的四元数。
使用该函数可以得到平滑的旋转效果。
例如在相机绕目标物体旋转时,产生一种流畅自然的效果,使得玩家感到相机的旋转非常平稳。Mathf.SmoothStep:平滑步进函数
该函数会在两个值之间进行平滑的步进,返回一个介于两个值之间的值。
使用该函数可以得到平滑的渐变效果,比如从一个颜色平滑地过渡到另一个颜色。
在相机跟随目标物体时,可以使用该函数控制相机的透明度或者颜色变化,产生一种流畅平滑的效果。

举例子 线性插值和阻尼插值

假设有一个游戏场景,其中有一个相机需要跟随玩家角色移动。在实现相机跟随的逻辑中,可以使用线性插值函数 Vector3.Lerp 或者阻尼插值函数 Vector3.SmoothDamp 来平滑移动相机。

使用线性插值函数的代码示例:

public class CameraFollow : MonoBehaviour
{public Transform target; // 要跟随的目标物体public float speed = 0.1f; // 相机移动的速度void Update(){// 计算相机的目标位置Vector3 targetPosition = target.position + new Vector3(0, 2, -5);// 使用 Lerp 方法平滑地移动相机transform.position = Vector3.Lerp(transform.position, targetPosition, speed);// 让相机一直朝向目标物体transform.LookAt(target);}
}

使用阻尼插值函数的代码示例:

public class CameraFollow : MonoBehaviour
{public Transform target; // 要跟随的目标物体public float smoothTime = 0.3f; // 阻尼时间private Vector3 velocity = Vector3.zero; // 当前速度void Update(){// 计算相机的目标位置Vector3 targetPosition = target.position + new Vector3(0, 2, -5);// 使用 SmoothDamp 方法平滑地移动相机transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);// 让相机一直朝向目标物体transform.LookAt(target);}
}

这两段代码都实现了相机跟随目标物体的逻辑,但是使用不同的插值函数得到的效果是不同的。使用线性插值函数会让相机的移动轨迹是直线,没有偏差或曲率,因此产生一种神秘或者简单的效果。而使用阻尼插值函数会让相机的移动速度更加缓慢、平稳,因此产生一种柔和的效果,可以让玩家感觉到相机的跟随更加自然。


举例子 四元数插值和平滑步进

假设有一个游戏场景,其中有一个相机需要绕着目标物体旋转。在实现相机旋转的逻辑中,可以使用四元数插值函数 Quaternion.Slerp 或者平滑步进函数 Mathf.SmoothStep 来平滑旋转相机。

使用四元数插值函数的代码示例:

public class CameraRotate : MonoBehaviour
{public Transform target; // 要旋转的目标物体public float rotateSpeed = 5f; // 旋转速度void Update(){// 计算相机需要旋转的角度Quaternion targetRotation = Quaternion.LookRotation(target.position - transform.position, Vector3.up);// 使用 Slerp 方法平滑地旋转相机transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotateSpeed * Time.deltaTime);}
}

使用平滑步进函数的代码示例:

public class CameraRotate : MonoBehaviour
{public Transform target; // 要旋转的目标物体public float rotateSpeed = 5f; // 旋转速度public float smoothTime = 0.1f; // 平滑时间private float currentVelocity = 0f; // 当前速度void Update(){// 计算相机需要旋转的角度Quaternion targetRotation = Quaternion.LookRotation(target.position - transform.position, Vector3.up);// 使用 SmoothStep 方法平滑地旋转相机float smoothRotation = Mathf.SmoothStep(0, 1, currentVelocity);transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, smoothRotation);// 更新当前速度currentVelocity += rotateSpeed * Time.deltaTime;currentVelocity = Mathf.Clamp01(currentVelocity);}
}