Kzeroko KTM2

过场场景数据

使用完整的过场场景 JSON 格式定义镜头轨道、角色指令、世界事件与字幕。

更新于 2026/9/26 19 分钟阅读

过场场景是由服务器加载的时间轴,组合镜头运动、角色指令、世界事件与字幕。位置相对于传入的枢轴,因此同一场景可以在不同地点播放,无须重写坐标。

文件放在哪里

场景 JSON 放在 data/<namespace>/cinematic_scenes/*.json,可包含子目录。默认由资源路径形成场景 ID;显式 id 可覆盖它。高优先级数据包替换同一资源 ID。不同文件若声明相同场景 ID,加载器会记录冲突,但此时后项已替换前项,且资源遍历没有排序。

纯镜头 Gecko 动画属于独立的客户端资源,放在 assets/<namespace>/camera_animations/*.json。场景的 gecko 轨道引用动画注册 ID,而不是 JSON 文件名。原生 spline 轨道不需要这种资源。

最小示例

这个短暂的固定镜头使用与内置 isekaiexpansion:hidden_hud_subtitle_scene 相同的镜头节点字段。保存为 data/example/cinematic_scenes/fixed_shot.json 后,场景 ID 为 example:fixed_shot;以每秒 20 刻计,40 刻为 2 秒。

{
  "schema": 1,
  "length_ticks": 40,
  "camera": {
    "track": {
      "nodes": [
        { "t": 0, "pos": [0, 1.7, 4], "rot": [0, 180, 0], "fov": 60 }
      ]
    }
  }
}

空对象也能解析,但不提供镜头姿态。它仍有默认播放设置,因此加载成功不代表镜头内容可用。

字段

根对象与播放设置

字段类型默认值含义与限制
schemainteger1保存的版本号;加载器不会拒绝其他整数。
idstring文件资源 ID覆盖查询 ID,必须是资源标识符。
length_ticksintegerduration,再默认 160场景时长,单位刻,至少为 1。
durationinteger160旧的时长别名;length_ticks 优先,但提供此字段时仍会解析。
playbackobject见下表HUD、输入、混合与淡入淡出设置。
pivotobject见下表仅作元数据;运行时使用触发器或调用方提供的变换。
actorsobject触发玩家角色键映射;缺少 player 时自动补入。
cameraobject空轨道与效果包含 track 与 effects。
actor_tracksobject空角色键 → 指令数组。
eventsarray<object>空服务器世界事件。
subtitlesarray<object>空客户端字幕指令。
字段类型默认值含义与限制
hide_hudbooleantrue隐藏普通 HUD;字幕使用独立覆盖层。
lock_inputbooleantrue锁定过场输入,播放期间关闭其他客户端界面。
lock_movementbooleantrue限制观众移动,场景驱动的本地玩家步行除外。
allow_esc_skipbooleanfalse允许观众申请跳过,需要所有当前观众投票。
fade_in_ticksinteger10入场淡入淡出时长,单位刻;正值会延迟本地播放,并推进起播时间。
fade_out_ticksinteger10离场淡入淡出时长,单位刻。
blend_in_ticksintegerfade_in_ticks有 playback 对象时默认使用入场淡入淡出时长;整个对象省略时,混合默认值为 8。
blend_out_ticksintegerfade_out_ticks有 playback 对象时默认使用离场淡入淡出时长;整个对象省略时,混合默认值为 8。
pivot.sourcestringtrigger空白恢复为 trigger;保存但不据此选择枢轴。
pivot.spacestringlocal_yaw空白恢复为 local_yaw;不会开启其他世界坐标模式。

所有场景时间均以刻为单位。总时长会钳制,但不会检查指令时间是否超过总时长;结束后的条目不会执行。播放淡入淡出与混合数值没有解析范围检查,客户端传输会将负值规范化为 0。省略 playback 时混合值为 8;提供空对象时为 10,因为缺失的混合字段会继承淡入淡出值。

枢轴坐标与角色

传入变换的参考姿态中,+X 向右、+Y 向上、−Z 向前。局部偏航 180 表示向前。位置偏移按枢轴偏航减 180 旋转;世界偏航等于枢轴偏航加局部偏航再减 180。位置使用方块单位,旋转使用度。pivot 元数据不会选择或移动实际变换。

字段类型默认值含义与限制
<actor-key>object无自定义角色去除两端空白,最多 64 字符;保留字母、数字、下划线、连字符、点和冒号。其他字符替换为连续折叠的下划线;空键变成 player。
selectorstringplayer 为 triggering_player;其他为 nearesttriggering_player、nearest、nearest_type。未知值回退为 nearest。
entity_typestring无可选实体类型 ID,约束最近实体搜索。
radiusnumber16搜索盒半边长,单位方块;解析目标时至少为 1。自动补入的玩家角色使用 0,并跳过搜索。
namestring无最近实体搜索要求显示名称精确匹配。
uuidstring无有效 UUID;找到活体实体后优先使用,不再检查最近搜索的筛选条件。

triggering_player 直接选择玩家,先于 UUID 与其他筛选。否则,UUID 找到的活体实体优先;找不到时继续最近实体搜索。两种最近选择器都使用轴对齐搜索盒及可选的类型和名称筛选,再从存活且未移除的候选者中选择离枢轴最近者。搜索盒不是球形半径检查。显式类型筛选会将触发玩家排除在该搜索之外。

规范化后相同的角色键会由后项覆盖前项。显式提供的 player 定义会保留,只有缺失时才补入默认触发玩家定义。播放开始时,无法解析的自定义角色会被省略。

镜头轨道与节点

第一张表描述 camera 及其中的 track,第二张表描述每个 track.nodes 条目。

字段类型默认值含义与限制
trackobject空 splinecamera 中的镜头轨道。
effectsarray<object>空camera 中按时间触发的屏幕效果。
typestring有 animation 时为 gecko,否则为 splinespline 或 gecko;未知值变成 spline。
interpolationstringcatmull_romcatmull_rom 或 linear;未知值变成 catmull_rom。
animationstring无gecko 轨道使用的动画注册 ID;缺失或找不到时不产生镜头姿态。
nodesarray<object>空按时间排序的样条关键帧。空数组不产生姿态,单节点为固定姿态。
字段类型默认值含义与限制
tintegertime,再默认 0时间位置,单位刻,非负;存在 t 时不读取 time。
timeinteger0仅在 t 缺失时使用的别名。
posarray<number>[0, 0, 0]恰好 3 个局部方块坐标:x、y、z。
rotarray<number>[0, 180, 0]恰好 3 个角度值:俯仰、偏航、翻滚。另见下方目标与旋转限制。
fovnumber无单位度,解析器不钳制范围。两端都缺失时保留基础视场角;只提供一端时,该段使用该值。
look_attarget无解析成功的目标覆盖俯仰与偏航;找不到目标时保留制作的旋转。
easestringlinear以此节点为终点的区段使用此缓动。

原生轨道按所选方式插值位置,线性插值俯仰,并按环绕角度插值偏航与翻滚。终点节点提供缓动。终点观察目标优先于前一节点的目标,不会在两个角色目标之间混合。

场景传输会重建镜头 JSON。节点有 look_at 时,只写入该目标而省略 rot,客户端因此重新解析出默认旋转。正常服务器播放中,不应依赖带目标节点所制作的翻滚或回退旋转能够保留。没有目标的节点保留旋转。

Gecko 轨道按每秒 20 刻换算场景已过时间,并限制到动画长度。此路径不使用纯镜头 API 的循环或保持选择。缺少动画数据时不产生姿态。

目标

look_at 与 face 接受下列字段组成的对象、含 3 个数字的局部位置数组,或字符串 walk_target。其他字符串不产生目标,null 也表示无目标。

字段类型默认值含义与限制
actorstring无角色键目标,先取脚部位置再加偏移。
posarray<number>无没有角色或移动终点目标时使用,恰好 3 个局部坐标。
offsetarray<number>[0, 0, 0]恰好 3 个局部偏移;围绕枢轴旋转后相加。
walk_targetbooleanfalsetrue 优先选择移动终点,再考虑 actor 或 pos。
targetstring空此处唯一特殊字符串值为 walk_target。

对象优先级依次为移动终点、角色、位置。角色目标使用脚部位置,拍摄面部时应增加向上的偏移。walk_target 对角色指令有意义;镜头节点没有对应移动指令提供终点,因此无法解析它。直接数据解析器不规范化目标角色字符串,而编辑器与客户端传输会规范化;各处应使用同一个已经规范化的键。

镜头效果

字段类型默认值含义与限制
t / timeinteger0共用非负时间刻与别名规则。
typestringshakeshake 或 distortion;未知值变成 shake。
durationinteger20单位刻,至少 1。
strengthnumber1震动像素强度钳制为 0–48;扭曲强度钳制为 0–1。低于或等于 0.001 时不启动效果。
frequencynumber14震动频率钳制为 0.1–60;扭曲直接传给着色器。
dampingnumber2.2震动衰减指数,钳制为 0.1–8;扭曲不使用。
speednumber1扭曲着色器时间倍率;震动不使用。

多个震动实例合并,最终受强度上限约束;新的扭曲替换当前扭曲。它们是客户端屏幕效果,不改变角色位置。中途加入的观众只播放已开始效果的剩余部分,不会从头重播完整时长。

角色轨道

字段类型默认值含义与限制
<actor-key>array<object>无轨道按角色键规则规范化;没有已解析角色时跳过轨道。
t / timeinteger0共用非负时间刻与别名规则。
typestringposepose、move_path、teleport、emoji、npc_body_emote、animation;未知值变成 pose。
durationinteger0至少 0 刻。移动需要正时长;其他指令类型的含义见下文。
modestring缺省时为 walkgrounded、walk、sprint、teleport_interpolated、navigation。未知或空白值回退为 grounded,而不是 walk。
posarray<number>无恰好 3 个局部坐标;姿态指令省略时保留当前位置。
yawnumber无局部偏航角,单位度;缺省使用当前朝向或移动及面向逻辑。
pointsarray<array<number>>空路径点,每个恰好 3 个坐标;路径采样时优先于 pos。
facetarget无面向目标;walk_target 指向本指令的最后路径点或 pos。
idstring无按类型解释为表情、NPC 肢体表情或玩家及 NPC 动画 ID。
forcebooleantrue切换表情 FORCE 与 REPLACE 策略,不是通用的强制移动开关。
speednumber1步行或冲刺的标准速度倍率,钳制为 0.25–4;寻路至少使用 0.05。
easestringlinear用于插值移动,不控制步行或冲刺的步态速度。
指令或模式播放行为
pose / teleport服务器进行离散的位置与偏航变更。默认 walk 模式,以及显式 grounded、sprint 模式,会将姿态贴合附近地面。
move_path 配合 walk / sprint感知碰撞的行走。非玩家角色在服务器移动,每位玩家角色通过自己的客户端移动输入行走。
move_path 配合 navigation可寻路角色向终点发起寻路;其他角色使用插值放置。
move_path 配合 grounded / teleport_interpolated服务器沿制作的路径插值;grounded 不会为每次插值移动额外执行感知碰撞的贴地处理。
emoji按制作的正时长播放指定贴纸,否则使用表情系统默认时长。
npc_body_emote在支持的 NPC 上强制播放肢体表情,不是通用玩家动画。
animation服务器播放 NPC 忙碌动画,客户端播放已注册玩家动画。对玩家而言,duration 控制入场混合,钳制为 0–10 刻,不控制片段长度。

步行或冲刺需要非零长度的路径。单个路径点或只有 pos,不会自动构成从角色当前位置出发的步行路线。移动不会把偏离路径的角色瞬移到首点;确实需要这种切换时,应显式使用姿态指令。

步态规则数值
标准步行速度每刻 0.2160 方块
标准冲刺速度每刻 0.2808 方块
制作速度倍率0.25–4
接受的时间速度范围缩放后标准速度的 0.80–1.25 倍

路径长度除以时长得到请求速度;超出范围时会钳制,并由加载器记录时间警告。此修正不会延长指令窗口或场景时长。角色受阻、偏离路径起步或时长过短,仍可能无法抵达终点。

正时长移动指令从起始刻执行到起始刻加时长,包含两端。重叠指令不会被拒绝或合并,应避免让同一角色同时接受互相竞争的移动指令。缺少角色或动画 ID 时跳过对应动作,不会因此拒绝整个场景。

世界事件

字段类型默认值含义与限制
t / timeinteger0共用非负时间刻与别名规则。
typestringsoundsound、effek、particle、weather、time;未知值变成 sound。
idstring无声音、Effek 或粒子资源 ID;对应类型缺少它时不执行。
posarray<number>枢轴位置事件使用,恰好 3 个局部坐标。
volumenumber1声音音量,直接传递。
pitchnumber1声音音调,直接传递。
scalenumber1Effek 缩放。
durationinteger20至少 1 刻;用于天气,不用于终止声音或 Effek 实例。
categorystringplayers声音分类,不区分大小写;未知或空白值回退为 players。
weatherstring执行时默认 clearrain、thunder、storm;其他值均为晴天。影响整个场景世界。
time_of_dayinteger-1世界时间值;负数不执行。
countinteger1粒子数量,至少 1。
spreadarray<number>[0, 0, 0]恰好 3 个世界轴向的粒子散布值,不随枢轴旋转。
speednumber0粒子速度参数。
visible_to_allbooleantrue仅传给 Effek 广播辅助方法,不是通用事件观众筛选。

事件在服务器到时后执行一次。声音与粒子通过世界广播;天气和时间改变整个世界,而非只改变观众的画面。粒子事件支持无额外负载的已注册简单粒子类型;方块或物品式粒子的附加参数不属于此格式。

字幕与缓动

字段类型默认值含义与限制
t / timeinteger0共用非负时间刻与别名规则。
durationinteger40显示时长,单位刻,至少 1。
speakerstring无可选翻译键或字面文本;空白时隐藏说话者行。
textstring必填翻译键或字面文本。
chars_per_secondnumber48文字显示速度;非正值立即显示整行。
colorinteger / string0(继承主题)ARGB 整数,或可带 # 的十六进制字符串。不超过 6 位时补不透明 alpha;更长的值转换为 32 位整数。

同一时间只有一条字幕,新指令会替换当前字幕。文本与说话者按翻译键解析,也可以直接使用字面文本。普通 HUD 隐藏时,字幕覆盖层仍可显示。中途加入的观众会从尚未过期字幕的已播放位置继续显示文字。

缓动名称为 linear、step、ease_in_quad、ease_out_quad、ease_in_out_quad、ease_in_sine、ease_out_sine、ease_in_out_sine、ease_in_cubic、ease_out_cubic、ease_in_out_cubic、ease_in_back、ease_out_back。输入不区分大小写,去除两端空白,并将连字符或空格转为下划线;也识别 easeInOutQuad 等紧凑名称。未知名称回退为 linear。

校验

输入结果
缺少可选字段使用上表对应字段的默认值
未知字段忽略,不会开启其他事件或执行模式
可选对象或数组容器类型错误按缺失处理;这不同于有效数组中的错误条目
数组条目结构错误、资源 ID 或 UUID 无效、缺少字幕 text、向量不是 3 个元素、标量转换失败拒绝该场景资源;其他场景继续加载
已知选项字段中的未知值回退到对应选项组的默认值,不是加载错误
不支持的 schema 整数保存,不拒绝版本,也不迁移
显式场景 ID 重复替换前项后记录错误;没有稳定的资源顺序优先项
空根对象接受并使用默认值
JSON 语法错误不产生有效场景
重载中出现错误新收集的映射替换旧映射,包含部分成功结果;失败的旧场景不会保留

解析器不检查数值是否有限,不限制最大时间轴长度或关键帧数量,也不会检查所有引用素材是否存在。应使用有限数值与有效 ID;解析成功不代表角色、动画、声音或粒子实际可用。

正常场景启动传输会发送压缩的制作草稿,接收时限制为 262144 压缩字节,最多发送 64 项角色绑定,每个键最多 64 字符。这是压缩体积限制,不是解压后内存上限。客户端重建会将许多向量、旋转及效果数值舍入到 3 位小数,规范化目标键并丢弃未知字段。时间轴应保持在传输预算内,且不要依赖更细的精度。

重载

/reload 重建服务器场景目录并增加修订号,即使重载存在错误也会如此。启动场景时发送当前定义与已解析角色绑定;原生轨道不要求客户端本地持有服务器数据包。Gecko 镜头动画与其他视觉素材仍须放在客户端资源包中。

正在运行的服务器播放保留启动时的场景对象。重载定义影响后续启动,不改变现有时间轴。检查修改时应重新启动场景;修改镜头动画素材后,还需单独重载客户端资源。

相关页面

表情数据定义表情指令使用的贴纸。NPC 素材介绍 NPC 动画资源,开发编辑器偏好介绍共享编辑器主题控件。