如何制作平滑的相机跟随算法?

Posted

技术标签:

【中文标题】如何制作平滑的相机跟随算法?【英文标题】:How to make a smooth camera follow algorithm? 【发布时间】:2012-10-25 01:06:17 【问题描述】:

我正在使用 LibGDX (Java) 制作游戏。

我需要相机跟随一个快速移动的角色。最简单的方法就是这样写:

this.getCamera().position.set(obj.x, obj.y, 0);

但是,有什么算法可以让这更流畅吗?就像镜头没那么严格,总是有点晚:角色快速向右,镜头跟随稍有延迟,或者如果你突然出现在很远的地方,镜头不会立即传送而是以最快的速度移动到你身边靠近它会放慢一点速度并再次找到你。

是否有任何 libgdx 库可以做到这一点或有人有这种经验?

【问题讨论】:

但是,有什么算法可以让这更平滑吗?”你有没有自己尝试过任何算法,或者谷歌搜索过平滑的相机插值或其他什么? 我自己尝试过,并有几个工作示例,但我不太喜欢结果,我很好奇是否已经找到了一些东西,因为这听起来像是任何游戏开发人员都需要的东西,关于谷歌搜索,我不知道该搜索什么,它带来了很多其他的东西。 【参考方案1】:

尝试一些简单的事情,比如 lerping 十分之一的距离。效果出奇的好。

float lerp = 0.1f;
Vector3 position = this.getCamera().position;
position.x += (Obj.x - position.x) * lerp * deltaTime;
position.y += (Obj.y - position.y) * lerp * deltaTime;

【讨论】:

建议:也乘以 delta-time 以使运动独立于帧率。【参考方案2】:

看看 Aurelion Ribon 的Java Universal Tween Engine。这会执行插值并有几个缓动方程,我认为它们可以让你得到你想要的东西。它还具有其他高级功能,例如路标和将某些动作链接在一起以获得其他有趣的效果。

您的游戏逻辑可以检查角色是否正在快速移动或在位置方面是否有阶跃变化。对此,请将您当前的相机位置转移到补间引擎并让它接管 - 平滑缩放到角色的当前位置。

【讨论】:

仅作记录(我意识到这是不久前的事了)不,你不会想为此使用补间引擎,因为游戏角色总是在移动并且容易受到用户控制的方向变化。启动和杀死补间的开销是没有意义的。只需在 upd(delta) 调用中使用上面的 lerp 算法。也就是说,UTE 用户界面非常适合其他此类过渡,甚至可以移动相机以进行除跟随主要游戏角色之外的其他事情。 我不同意。虽然我还没有进行时序分析,但补间是合并的,因此启动和终止的影响应该是最小的。分配一个新的补间只是一组分配,杀死一个补间同样只是将对象返回到池中。我在游戏中使用了这种方法来帮助平滑相机运动,而不是直接锁定角色而不会产生明显的性能影响。相机不会产生不和谐的动作,而是懒洋洋地跟随玩家,这看起来更好看。

以上是关于如何制作平滑的相机跟随算法?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby‘s Adventrue游戏制作笔记Unity相机跟随玩家移动

实现相机平滑跟随物体移动

如何让相机跟随 LibGDX 中的播放器

unity 相机跟随物体(角色)

# Unity2D相机跟随的多种姿势

# Unity2D相机跟随的多种姿势