无模组运镜:关键帧、插值与旁观者模式技巧
在原版《我的世界》中实现镜头移动的两种方法——逐刻传送函数与时间轴注册表。本文将介绍它们各自的适用场景,以及如何通过平滑处理避免画面僵硬。
原版《我的世界》中没有“摄像机”对象,因此所谓的“运镜”实际上是以下两种错觉之一。
方法一:每刻传送玩家
这是老旧但通用的方法。将玩家设置为旁观者模式,然后沿着路径移动他们:
gamemode spectator @s
tp @s 100.0 70.0 200.0 -90.0 10.0
每个 tp 函数链每刻执行一次。这种方法适用于所有版本,无需任何特殊设置。但它所有的问题都与平滑度有关:
- 每秒20个关键帧。 一个十秒的镜头需要200行
tp命令。 - 线性步进显得机械。 真实的镜头移动会有缓入和缓出效果。
- 旋转处理不佳。 从偏航角170度到-170度,实际只转动了20度,但朴素的插值会错误地旋转340度。在步进之前,将角度差归一化到-180…180的范围内。
关键帧工具就是用来生成这些命令的——你放置几个位置,它就会生成带有缓动效果的逐刻函数。
缓动
业余与可观看之间的区别在于插值曲线。在两个关键帧之间,t 从0到1:
linear t
ease-in-out t < 0.5 ? 2t² : 1 − 2(1−t)²
smoothstep t² × (3 − 2t)
smoothstep 是安全的默认选项。将其同时应用于位置和旋转,否则镜头会在完成转向之前到达目的地。
方法二:时间轴注册表
较新版本增加了时间轴格式,它将整个镜头描述为数据,而不是数百个传送命令:
data/<namespace>/timeline/intro.json
带有时间点和插值模式的关键帧,通过一个命令即可播放。优点:
- 文件小得多。 六个关键帧代替了两百个传送命令。
- 原生插值,无需手动计算缓动。
- 帧率无关——它不会像在负载较高的服务器上那样,出现逐刻传送导致的卡顿。
缺点是它只存在于最新版本中,因此针对旧客户端的地图仍然需要方法一。
保持玩家不动
两种方法都需要解决两个问题:
- 玩家输入。 旁观者模式允许玩家在镜头播放中途飞走。每刻重新传送会覆盖玩家输入,这也是暴力方法仍然存在的原因之一。
- 区块加载。 摄像机飞到未加载的区域会显示虚空。在镜头播放前
/forceload路径,播放后移除。
隐藏HUD
/gamerule doImmediateRespawn、旁观者模式和F1键可以帮你完成大部分工作。为了获得干净的画面,一个清空HUD精灵的资源包可以在玩家不按任何键的情况下移除准星和快捷栏——请参阅HUD指南。
在路径上放置关键帧,并使用运镜与时间轴构建器导出逐刻函数或时间轴JSON。