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)=(1−t)A+tBPos(t) = (1-t)A + tB

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

202511182038000000000030.gif

高阶贝塞尔曲线 ​

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

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

Pos(t)=(1−t)2A+2t(1−t)B+t2CPos(t) = (1-t)^2A + 2t(1-t)B + t^2C

202511182114000000000030.gif

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

Pos(t)=∑i=0kk!i!(k−i)!ti(1−t)k−i⋅AiPos(t) = \sum_{i=0}^{k} \frac{k!}{i!(k-i)!} t^{i} (1-t)^{k-i} \cdot {A_{i}}

202511182152000000000030.gif

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

插值矩阵形式 ​

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

Pos(t)=A0+t(−3A0+3A1)+t2(3A0−6A1+3A2)+t3(−A0+3A1−3A2+A3)Pos(t) = {A_{0}} + t(-3{A_{0}} + 3{A_{1}}) + t^{2}(3{A_{0}} - 6{A_{1}} + 3{A_{2}}) + t^{3}(-{A_{0}} + 3{A_{1}} - 3{A_{2}} + {A_{3}})

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

Pos(t)=[1tt2t3]⋅[1000−33003−630−13−31]⋅[A0A1A2A3]Pos(t) = \begin{bmatrix} 1 & t & t^{2} & t^{3} \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 \\ -3 & 3 & 0 & 0 \\ 3 & -6 & 3 & 0 \\ -1 & 3 & -3 & 1 \end{bmatrix} \cdot \begin{bmatrix} A_{0} \\ A_{1} \\ A_{2} \\ A_{3} \end{bmatrix}

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

Catmull-Rom曲线 ​

我们将每个𝐴i𝐴_i点处速度方向定义为上一点𝐴𝑖−1𝐴_{𝑖−1}到下一点𝐴i+1𝐴_{i+1}的方向,大小为s𝐴i−1𝐴i+1⇀s\overrightharpoon{𝐴_{i-1}𝐴_{i+1}}。

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

由已知条件

{C(0)=A1C(1)=A2C′(0)=sA0A2→C′(1)=sA1A3→\begin{cases} C(0)={A_{1}} \\ C(1)={A_{2}} \\ C^{\prime}(0)=s \overrightarrow{A_{0}A_{2}} \\ C^{\prime}(1)=s \overrightarrow{A_{1}A_{3}} \end{cases}

可解得

{c0=A1c1=−sA0+sA2c2=2sA0+(s−1)A1+(3−2s)A2−sA3c3=−sA0+(2−s)A1+(s−2)A2+sA3\begin{cases} c_{0}={A_{1}} \\ c_{1}= -s {A_{0}} + s {A_{2}} \\ c_{2}= 2s {A_{0}} + (s-1) {A_{1}} + (3-2s) {A_{2}} - s {A_{3}} \\ c_{3}= -s {A_{0}} + (2-s) {A_{1}} + (s-2) {A_{2}} + s {A_{3}} \end{cases}

由此得出

Pos(t)=[1tt2t3]⋅[0100−s0s02ss−33−2s−s−s2−ss−2s]⋅[A0A1A2A3]Pos(t) = \begin{bmatrix} 1 & t & t^{2} & t^{3} \end{bmatrix} \cdot \begin{bmatrix} 0 & 1 & 0 & 0 \\ -s & 0 & s & 0 \\ 2s & s-3 & 3-2s & -s \\ -s & 2-s & s-2 & s \end{bmatrix} \cdot \begin{bmatrix} A_{0} \\ A_{1} \\ A_{2} \\ A_{3} \end{bmatrix}

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

202511202010000000000030.gif

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

Hermite曲线 ​

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

Pos(t)=[1tt2t3]⋅[10000100−3−23−121−21]⋅[A0v⃗1A1v⃗1]Pos(t) = \begin{bmatrix} 1 & t & t^{2} & t^{3} \end{bmatrix} \cdot \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ -3 & -2 & 3 & -1 \\ 2 & 1 & -2 & 1 \end{bmatrix} \cdot \begin{bmatrix} A_{0} \\ \vec{v}_{1} \\ A_{1} \\ \vec{v}_{1} \end{bmatrix}

其形状与速度如下图所示

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