如何编写一个流畅的相机跟随算法?

21

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

我需要相机跟随一个快速移动的角色。最简单的方法是编写以下代码:

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

但是,是否有任何算法可以使这更加平滑?比如当相机不那么严格时,总是有点晚:角色快速向右移动,相机稍有延迟跟随,或者如果你突然出现在远处,相机不会立即瞬移到你身边,而是以最高速度前往,当接近时减速并再次找到你。

是否有任何libgdx库可以实现这一点或者有人有这样的经验?


“但是,有没有任何算法可以使这更加平滑?”你自己尝试过任何算法,或者在谷歌上搜索了平滑相机插值或类似的东西吗? - Nicol Bolas
1
我自己尝试了几个工作示例,但结果并不是很满意。我很好奇是否已经有人解决了这个问题,因为这似乎是任何游戏开发者都需要的东西。关于谷歌搜索,我不确定该搜索什么,它会带来大量其他内容。 - Avetis Zakharyan
2个回答

51

尝试一些简单的事情,比如将距离的十分之一进行线性插值。它会出奇的好用。

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;

18
建议:还要乘以delta-time,使运动独立于帧速率。 - Mortennobel

6
请看Aurelion Ribon的Java通用插值引擎。它可以进行插值计算,并且拥有多个缓动方程,我认为这将是您正在寻找的。它还具有其他高级功能,如路标和链接某些操作以获得其他有趣的效果。
您的游戏逻辑可以检查角色是否快速移动或位置发生了步进更改。作为响应,将您当前的相机位置转移到缓动引擎,并让它接管-平稳地缩放到角色的当前位置。

就记录而言(我意识到这是一段时间前的事情),不应该在这种情况下使用缓动引擎,因为游戏角色始终在移动并容易受用户控制的方向变化的影响。启动和终止缓动的额外开销毫无意义。只需在upd(delta)调用中使用上述lerp算法即可。话虽如此,UTE在其他过渡效果或甚至用于移动摄像机跟踪主要游戏角色以外的物体时非常出色。 - RichieHH
我不同意。虽然我没有进行时间分析,但补间动画是被池化的,因此启动和终止的影响应该很小。分配新的补间动画只是一组赋值操作,终止补间动画类似地将对象返回到池中。我在一个游戏中使用了这种方法,以帮助平滑相机运动,而不是直接锁定角色,没有观察到性能影响。相机慢慢地跟随玩家,而不是突兀地移动,这对眼睛来说更好看。 - user656698

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接