平滑放大LibGDX的方法?

Ways to smoothly zoom in LibGDX?

我正在构建一个 LibGDX 游戏,需要放大和缩小相机。但是当我做 camera.zoom = 1.2f; 时,它只是 'jumps' 到那个值。相反,我想要一个平滑的缩放。

我的问题: 平滑缩放的最佳方式是什么?

我想像下面这张图一样缩放。 y=0 是开始 cam.zoomy=100 是期望的 cam.zoom,x 轴显示时间。

我应该使用 cam.zoom = f(time); 吗? (对 f(x) 进行了一些修改)

time is the total time passed since the beginning of the zoom.

还是更好用:

cam.zoom += (desiredZoom - cam.zoom) * delta * scalar;

delta is the time between two frames and
scalar is a float that will be adjusted in order to set the speed.

或者还有其他更好的方法吗?你怎么看?

非常感谢!

我知道的最简单的方法是使用带插值的倒计时。

// member variables:
float timeToCameraZoomTarget, cameraZoomTarget, cameraZoomOrigin, cameraZoomDuration;

private float zoomTo (float newZoom, float duration){
    cameraZoomOrigin = camera.zoom;
    cameraZoomTarget = newZoom;
    timeToCameraZoomTarget = cameraZoomDuration = duration;
}

// in render():
if (timeToCameraZoomTarget >= 0){
    timeToCameraZoomTarget -= deltaTime;
    float progress = timeToCameraZoomTarget < 0 ? 1 : 1f - timeToCameraZoomTarget / cameraZoomDuration;
    camera.zoom = Interpolation.pow3out.apply(cameraZoomOrigin, cameraZoomTarget, progress);        
}

您可以将 Interpolation.pow3out 替换为任何函数 pictured here

您可以使用 MathUtils.lerp 方法。

示例:

MathUtils.lerp(currentZoom,targetZoom,progress);

增加进度值以变快或降低以减慢值变化的速度。