Skip to content

原版摄像机动画资源库

CoolGaston

CoolGaston

“摄像机动画资源库”是基于旁观展示实体、teleport命令,以纯指令驱动运行的数据包模组。

支持版本:Minecraft Java Edition 1.21.6+

展示与介绍视频【MC数据包】原版摄像机动画支持库

设计原型

模组ReplayMod

Bedrock Edition(基岩版)命令camera

运镜(Camera Movement)

Q:“为什么要在Minecraft中实现运镜?”原版摄像机动画资源库

A:“在游戏中,如果只有静态场景,视觉效果不够流畅,显得机械。同样的场景,如果画面有运镜,视觉效果便更加流畅自然。”

基础运镜

在影片拍摄时,常通过以下方式实现运镜:

  • 推、拉镜头

  • 摇晃镜头

  • 平移镜头

  • 升、降镜头

  • 甩镜头

分镜

提升画面质量、渲染氛围与营造感受,可以应用以下的方法:

  • 正反打

  • 跳轴拍摄

  • 透视原理

  • 构图

  • 蒙太奇手法

有了运镜,动画内涵便从视觉效果无形中表达出来,提升玩家沉浸感,丰富游戏可玩性。

特点

数据包功能

  • 过场动画、鸟瞰俯瞰场景摄像机运镜设计

  • 技能动画运镜设计

数据包优点

  • 流畅性

相比于直接旁观实体的tp插值,数据包允许平滑曲线运动,插值矩阵构造一阶导连续甚至二阶导连续的轨迹,观感舒适。

  • 便捷性

相比于AnimatedJava等插件生成的摄像机运动,数据包可以实时编辑、预览轨迹,更加便于使用。

  • 实时性

相比于命令生成与插件创建编辑,数据包的实时预览功能极其突出,无论保存或正在编辑的轨迹,都可以通过一条命令预览与调试。

使用方法

安装 CameraMovement 摄像机动画资源库

最新版本V4.0

下载链接 https://wwbol.lanzout.com/i1j6M3ip661a

安装到存档请见Minecraft Wiki 数据包-使用

编辑与播放

管理员与管理物品


  • 在游戏内,玩家随时可以使用以下命令申请管理员
mcfunction
trigger camera_animation
  • 申请管理员后,若背包存在空间,即获得“关键帧工具”或“自由动画工具”,以下大部分操作均基于主手手持“关键帧工具”或“自由动画工具”生效。

  • 关键帧工具:用于创建、编辑轨迹动画。轨迹动画的位置固定不动,就像火车铁轨一样,摄像机只能按照预设的路径移动。

  • 自由动画工具:用于创建、编辑自由动画。自由动画的位置根据播放函数的执行位置而定,在不同坐标播放可以看到不同的摄像机路径。

创建与编辑


  • 手持“关键帧工具”或“自由动画工具”时,当前存在的轨迹会以海晶灯(未选择)或菌光体(已选择)的形式显示,已选择的轨迹会显示预览(粒子效果),关键帧以侦测器的形式显示。

  • 按E打开背包,悬停在“关键帧工具”或“自由动画工具”上可以查看操作键:

  • F创建轨迹

  • 对于轨迹(海晶灯/菌光体)点左键选中,右键进入编辑页面

  • 对于关键帧点左键是移动,单独点右键是设置朝向,左Shift(潜行)+右键打开位置设置面板

  • 按Q删除关键帧或录制段

  • Shift+F打开数据包设置面板

保存与播放


进入游戏时默认显示的面板中有主要功能函数的介绍

保存动画
mcfunction
function camera:save/this {id: xx}
  • id:轨迹的标准序号

  • 标准序号:右键打开编辑页面标题栏的轨迹数字序号,或轨迹实体(海晶灯/菌光体)的名称中的数字序号

播放动画

轨迹动画

播放一段动画

mcfunction
function camera:play/this {id: xx, cmd: '', stay: xx, tp: [0或1]}
  • stay:在一定游戏刻后开始播放轨迹动画

  • cmd:在结束后执行命令(若不需要则留空字符串 " " )

  • tp:播放完是否将玩家传送回播放前的位置(0则不传送,1则传送)

播放多段动画

mcfunction
function camera:play/this {id: [1,2,3……], cmd: '', stay: xx, tp: [0或1]}
  • id:多段轨迹的标准序号组成的列表,用逗号 “ , ” 分隔。

自由动画

播放一段动画

mcfunction
execute as entity positioned x y z rotated ry rx run function tween:play/this {id: xx, cmd: '', stay: xx, tp: [0或1], free: [x, y, z, ry, rx ]}
  • 具体控制哪个玩家在什么位置播放自由动画,否则函数将无效。

  • free:一个五位有序数表,x y z ry rx 分别确定这五个坐标是否为自由坐标。 其中x y z 的自由坐标代表局部坐标 ^ ,非自由坐标为相对坐标 ~ ;ry rx 的自由坐标代表相对坐标 ~ ,非自由坐标为绝对坐标 ry rx 。

  • 例如锁定 y 为非自由坐标,x z ry rx 为自由坐标,则传入 free: [ 1, 0, 1, 1, 1 ],游戏执行等效于如下修饰。

mcfunction
execute positioned ^ ~ ^ rotated ~ ~
终止动画

仅调试模式时,在播放过程中强制切断动画

mcfunction
function camera:play/stop
  • 执行后会强制切断正在播放的轨迹动画。

玩家设置


开发功能

启用

mcfunction
scoreboard players set #enable camera_animation 0
  • 单次使用后将禁用进入游戏的重载提示,且不允许其他玩家成为操作员。

禁用

mcfunction
scoreboard players set #enable camera_animation 1
  • 单次使用后将启用进入游戏的重载提示,且允许其他玩家成为操作员。

玩家播放

启用

mcfunction
tag entity add camera.enable
  • 执行后该玩家将启用动画的播放,在执行相关函数后玩家可以正常看到摄像机运动。

禁用

mcfunction
tag entity remove camera.enable
  • 执行后该玩家将禁用动画的播放,在执行相关函数后玩家无法看到摄像机运动。

卸载与优化

卸载


mcfunction
function camera:uninstall/all
  • 上述命令将移除数据包全部内容,包括生成、保存的轨迹,全部记分项和命令存储。

  • 提示成功后,可以使用如下命令安全卸载数据包,随后销毁相关物品(关键帧工具与自由动画工具)

mcfunction
datapack disable "[前置]CameraMovement V4.0 - 1.21.6+"

优化


  • 1.保存

Q:“我创建轨迹为什么会变卡?” A:“可以试试保存轨迹,大幅减少实体卡顿”

为什么要用实体呢?不如命令存储卡顿低?

在数据包开发最初,为了实现轨迹预览功能,以及并未考虑到计算机性能问题,因而使用marker实体。函数中大量@e扫描会造成难以容忍的卡顿,新增的保存函数可以极大优化卡顿,详见上文说明。

如果轨迹保存过后依旧造成大量卡顿,请务必联系作者反馈!

  • 2.降低渲染

Q:“我只是帧率低,但是游戏运算并不卡有什么轻量化的优化方案?” A:“可以试试禁用轨迹预览”

在Shift+F打开的数据包设置面板中可以看到“显示轨迹预览一栏”,将其设置为“关”并保存设置即可关闭粒子渲染显示。

数据包设置面板

使用详解

贝塞尔曲线编辑

展示视频-贝塞尔曲线使用方法


Q:“相比于Catmull-Rom曲线算法,贝塞尔曲线既要编辑大量控制点位(关键帧与插值帧),播放起来又卡顿,怎么还将其留在数据包内?”

A:“正是因为贝塞尔曲线的高度可编辑性,在牺牲便捷性同时可以通过微调关键帧与插值帧,构建更复杂的运动函数,甚至可以做到二阶导连续。”

在相邻的关键帧间,摄像机运动总是从红色羊毛方向切向靠近关键帧,再从蓝色羊毛方向切向离开,因此相比于Catmull-Rom曲线,其在关键帧处的速度拥有更高可控性。

编辑贝塞尔曲线时同画图软件的钢笔工具,一般将插值帧(两侧控制点)三等分排布在两个相邻关键帧间,达到较为稳定的速度与加速度(曲率)。 角度也需要控制在球坐标中的ry(偏航角)与rx(俯仰角)均匀划过球面,这样可以让转动更加贴近球面短路径曲线,而非坐标上的曲线运动。 例如从 ( ry, rx ) = ( 0, -90 ) 转向 ( 90, 0 ) 摄像机旋转的轨迹类似螺旋线,但实际上我们视线希望转过的路程较小,因此可以在 ( 0, 90 ) 对应的蓝色羊毛从 ry = 0° 旋转到 ry = 50° ,而 ( 90, 0 ) 对应的红色羊毛只从 ry = 90° 旋转到 ry = 75° 左右,最终呈现效果更加贴近于我们希望的较短路径。

2026218球坐标展示.jpg

正如图中所示,红线是按照坐标上三等分法摄像机视线会转过的路径,而黄线为视觉修复下摄像机视线会转过的路径。 而Catmull-Rom曲线插值算法不支持单独控制每个关键帧处的速度与角速度,从而导致视线在俯仰角过大时显得速度不平滑了,正因如此,贝塞尔曲线在处理复杂旋转时尤其好用。

设置面板


数据包设置面板

  • 插值生成速度:控制每游戏刻插值帧生成数量,降低此项有利于游戏MSPT的降低,会增加插值帧生成时间。

  • 播放实体:动画播放时玩家旁观的实体,建议使用展示实体,拥有更平滑的路径插值算法,不过有概率出现卡顿情况,属于展示实体的Bug;盔甲架则不会播放卡顿,不过其路径较不平滑,有明显的顿挫感。

  • 轨迹预览:是否开启粒子显示选中的轨迹路径,会小幅增加渲染压力。

  • 切换动画模式:在轨迹动画与自由动画模式间切换,不同模式下只会渲染此动画模式的轨迹。

编辑页面


2026021818.40.56.png

  • 更改插值数 & 修改动画信息:无论其值与更改前是否相等都会刷新轨迹,并且在两关键帧间生成这里规定数量的帧,如果遇到轨迹生成出错,可以使用此按键刷新。

  • 更改注释:将轨迹注释修改为设置值,轨迹注释只在编辑页面可见,不会对播放产生影响。

  • 迁移轨迹:将轨迹标准序号更改为其他序号数,只能迁移为不存在的轨迹,如果迁移至按顺序还未生成的序号,则按顺序生成(创建轨迹)时会略过此轨迹序号。

  • 删除轨迹:清除此轨迹对应的实体、分数、命令存储。

缓动函数页面


2026021818.48.47.png

2026021818.48.59.png

  • 在F键创建轨迹时,在缓动函数页面点击缓动函数名称按键,打开缓动函数列表,如上图所示。

  • 在缓动函数列表单击选中缓动函数,双击选中并使用,等价于单击后点击退出选择。

在创建缓动函数页面,有如下两个选项:

  • 通过解析式创建

写入缓动函数解析式,支持 + - * / ^ () 五种运算符与括号,以及常数 e(2.71) π(3.14),其中自然常数e用小写字母 “ e ” 表示,圆周率π用小写字母 “ p ” 表示。

写入的空格会自动忽略。

2026021818.50.49.png

  • 通过定点创建

仿照下式用小括号 ( ) 包围有序二元数组,自变量顺序无规定,只需要存在即可判定。

写入的空格会自动忽略。

2026021818.51.00.png

  • 缓动函数详见文章末链接。

原理推导

贝塞尔曲线

初见插值——从向量开始

两向量a与b的和,通过改变a与b前系数,使其恒为定值,可以获得一条直线。 如果时间t参与构成向量的系数,便得到了最基础的插值运动——直线运动:

Pos(t)=(1t)A+tB

当t从0步进到1时产生的线段刚好就是\overrightharpoonAB。将两个点通过不同加权得到的线称之为Lerp函数,也就是一切插值的起点。

202511182038000000000030.gif

高阶贝塞尔曲线

进一步讲,如何让运动更可控,类似于物理的加速度概念,当运镜过程符合实际运动规律时视觉效果更加平滑。

因此可以通过叠加两次Lerp插值,实现简单的平滑曲线:

Pos(t)=(1t)2A+2t(1t)B+t2C

202511182114000000000030.gif

仿照上述过程,进行多重运动叠加,当有控制点n个时,称之为n1阶贝塞尔曲线。 不难看出,曲线已经足够平滑且自由了。 对于k阶贝塞尔曲线,有控制点𝐴0𝐴1𝐴𝑘

Pos(t)=i=0kk!i!(ki)!ti(1t)kiAi

202511182152000000000030.gif

经过使用,人们发现三阶分段曲线最为实用,能兼顾平滑与可编辑性。因此以下讨论皆为三阶曲线

插值矩阵形式

换一种写法,写出三次贝塞尔曲线关于t的多项式函数。 当控制点为𝐴0𝐴1𝐴2𝐴3

Pos(t)=A0+t(3A0+3A1)+t2(3A06A1+3A2)+t3(A0+3A13A2+A3)

为了更清晰显示t不同次数与Ai的关系,我们将其写为矩阵形式:

Pos(t)=[1tt2t3][1000330036301331][A0A1A2A3]

现在,我们有了三阶贝塞尔曲线的矩阵形式,由此,不妨试试更改矩阵的项,我们会得到不同的曲线,这些曲线统一称为样条线。

Catmull-Rom曲线

我们将每个𝐴i点处速度方向定义为上一点𝐴𝑖1到下一点𝐴i+1的方向,大小为s\overrightharpoon𝐴i1𝐴i+1

使用t的多项式形式,设曲线为sPos(t)=𝑐0+𝑐1𝑡+𝑐2𝑡2+𝑐3𝑡3,考虑轨迹从𝐴1𝐴2的过程。

由已知条件

{C(0)=A1C(1)=A2C(0)=sA0A2C(1)=sA1A3

可解得

{c0=A1c1=sA0+sA2c2=2sA0+(s1)A1+(32s)A2sA3c3=sA0+(2s)A1+(s2)A2+sA3

由此得出

Pos(t)=[1tt2t3][0100s0s02ss332sss2ss2s][A0A1A2A3]

曲线的形状如下图所示,其中s为 [ 0, 1 ] 的参数

202511202010000000000030.gif

s=0.5时曲线尤为流畅,因此数据包选用此曲线,其名称为Catmull-Rom样条。

Hermite曲线

其中,数据包的录制模式支持间隔采样再插值,即先获取玩家在一些点的位置速度信息,再依次穿过这些点生成平滑曲线,其插值算法即为Hermite曲线

Pos(t)=[1tt2t3][1000010032312121][A0v1A1v1]

其形状与速度如下图所示

202511212026000000000030.gif

可以看到,此算法生成的曲线更加动态,无二阶导连续。

  • 至此,有关插值曲线的推导就结束了,在此感谢你看到这里!

  • 也希望你对摄像机动画支持库有良好的评价

制作鸣谢

特别感谢

七柏——提供思路
徐木弦——提供思路
星空下璀璨的星——提供优化
文雯EVE——Bug调试与修复

制作工具与网站

Axiom Mod
DatapackHelperPlus
PCL2
MinecraftWiki

文献参考

什么是插值
缓动函数
基岩版32种缓动函数
贝塞尔曲线介绍
样条插值算法
贝塞尔曲线详解
Catmull-Rom曲线详解1
Catmull-Rom曲线详解2
Hermite曲线详解
样条函数及三次样条插值
MCBE Camera命令详解
终于实现电影级运镜!!camera指令到底还有多少用途!?
完整分镜教程-从零基础到实战
那些你早该知道的镜头原理

总结与展望

  • 数据包完全免费开源点此查看更新,密码:e0qv。

  • 合作与Bug反馈请移步CoolGaston个人空间私聊作者。

  • 最后,衷心希望此资源库数据包能为各位开发者的地图创作带来便利!

Powered by Vitepress and Github Pages