不用模组的摄像机过场动画:关键帧、插值与旁观者模式技巧
原版移动摄像机的方式只有一种——逐刻传送函数——而时间轴注册表则负责烘托氛围。各自擅长什么,以及如何平滑处理才能不显得机械,用传送方式做镜头时,每秒需要 20 个关键帧,十秒的镜头就得写两百行传送命令。
原版中并不存在摄像机实体,所以过场动画本质上是用传送堆出来的幻觉,再配合时间轴来改变周围的世界。
方法一:每刻传送玩家
这是最古老、最通用的做法。把玩家设为旁观者模式,然后让他们沿路径移动:
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 是安全的默认选择。把它同时应用到位置和旋转上,否则摄像机会在转完之前就到达终点。
方法二:时间轴,用于摄像机之外的一切
较新版本加入了一个 timeline 注册表,很容易让人以为它是摄像机轨道:
data/<namespace>/timeline/intro.json
但它不是。时间轴基于世界时钟运行,对环境属性做关键帧——天空和雾的颜色、环境音效和音乐、光源方块——并带有原生插值。它无法移动玩家,所以摄像机本身仍然要靠方法一。时间轴擅长的是过场动画的氛围:让天空渐暗、切换雾气、配合传送同步更换音乐,而不需要为每一项都写逐刻命令。
代价是它只存在于较新版本中,所以面向旧客户端的存档只能用 /time 和 /weather 来伪造氛围。
让玩家待在原地
传送路径要和两件事对抗:
- 玩家输入。 旁观者模式让玩家可以在镜头中途飞走。每刻重新传送会覆盖它,这也是暴力方法一直存在的原因之一。
- 区块加载。 摄像机飞向未加载的区域会看到虚空。在拍摄前对路径执行
/forceload,拍完后移除。
隐藏 HUD
旁观者模式和 F1 已经能解决大部分问题。要获得干净的画面,可以用一个把 HUD 精灵图清空的资源包来移除准星和快捷栏,而不需要玩家按任何键——参见 HUD 指南。
把关键帧放在路径上并导出逐刻函数,再构建时间轴来布置周围的场景,配合过场动画与时间轴构建器。