UID 82897 性别 保密 经验 EP 铁粒 粒 回帖 0 主题 精华 在线时间 小时 注册时间 2021-7-23 最后登录 1970-1-1
本帖最后由 Cat_Anchor 于 2024-10-24 19:48 编辑 前言
在 MC 基岩版中,玩家通过相机观察世界。在 1.19 及以前,游戏内置了三种相机,就是第一人称、第三人称正面和第三人称背面。而在 1.20,随着 /camera 命令加入,一个新的相机——自由相机被加入了游戏。随着版本更新,相机支持的功能越来越多,/camera 的语法也越来越多。这篇文章介绍了关于相机的功能。 相机预设和列表
| 相机预设
相机预设是在行为包中定义的 JSON 文件,它指定了相机的默认值。比如原版的自由相机的位置在 (0, 0, 0),也就是说如果你在正常世界的原点附近将相机改为自由相机,那么你会看到地底的景象(不过更可能是旁观模式的景象)。
在行为包中,有 cameras 文件夹存储相机预设和列表,其中 presets 是相机预设。我们看原版的文件示例:{ "format_version": "1.19.50", "minecraft:camera_preset": { "identifier": "minecraft:free", "pos_x": 0, "pos_y": 0, "pos_z": 0, "rot_x": 0, "rot_y": 0 } } 复制代码
其中,format_version 是格式版本,目前最高是 1.19.50,也可以填写更高的。identifier 就是这个预设的 ID,会在 /camera 命令中用到。
pos_x pos_y pos_z 指定相机默认的位置,这个好理解,就是三维坐标。
rot_x rot_y 指定相机默认的旋转角度,必须在 -90 和 90 之间。要理解这个,我们首先来看三个名词:偏角(Yaw)、俯仰(Pitch)和滚转(Roll)。
偏角指定相机水平旋转的角度,就是东南西北的朝向,对应的是 X 轴,也就是 rot_y 字段。俯仰指定相机垂直旋转的角度,就是抬头低头的程度,对应的是 Y 轴,也就是 rot_x 字段。而滚转指定屏幕旋转的角度,就是相机是否倾斜以及倾斜的程度。对应的是 Z 轴,但在基岩版中没有对应的字段,也就是不能更改 Z 轴。
还有一个同级的 inherit_from 字段,用于继承其他相机的预设。还可以有其他字段,会在以后提到。| 相机列表
相机列表与相机预设相似,它存储在行为包根目录/cameras/lists 文件夹下。原版似乎没有相机列表,所以相机列表的作用不明,这是一个例子:{ "format_version": "1.21.0", "minecraft:camera_list": { "identifier": "supplementary:easing_camera_list", "cameras": [ "supplementary:easing_camera" ] } } 复制代码
其中,format_version 是格式版本,目前最高是 1.19.50,也可以填写更高的。identifier 指定了相机列表的 ID,不过可能没有任何地方用到这个 ID。cameras 是一个字符串数组,内含这个相机列表包含的相机。玩家影响相机
| 夜视/失明相机
正常来说,玩家获得夜视效果不会让自由相机也获得夜视效果。如果我们在预设字段添加 player_effects 字段并设为 true("player_effects": true),那么玩家获得的夜视和失明效果会影响相机。| 遮挡相机
在早期版本中,基岩版还没有爬行功能,所以我们会用水进入游泳状态并游进一格高的洞,来实现爬行效果。这时如果切换第三人称,那么屏幕会变成纯黑,因为虽然碰撞体积不与方块相交,但游戏判定玩家的相机(头部)在方块里。又因为相机在方块里时第三人称下的相机会变黑,这才导致了“爬行”时第三人称变黑的问题。
1.20.10 版本更新了爬行,修复了这个问题。但如果我们在方块里,而使用在外面的自由相机,屏幕也会变黑,因为游戏判定的是玩家头部的位置而不是自由相机的位置。现在,所有自由相机都不会变黑了。| 远距离相机
游戏只渲染玩家附近加载的区块和实体。也就是说,如果把相机弄到离玩家很远的地方,它只会拍到天空,这时会有一条内容日志警告,因为这是非预期的相机使用方式。为了改善这一点,minecraft:extend_player_rendering 组件被加入了,而且应用在自由相机上。有了这个组件,只要相机在已加载区块里移动,实体和方块就会渲染,它就能拍到画面了。比如给矿车加上 minecraft:tick_world 组件,让相机跟踪矿车,让矿车在一段很长的铁轨上跑,相机会拍下全过程,而不是拍到天空和虚空。| 收音相机
正常来说,玩家听到的声音会有方向来源的反映,比如玩家左边有声音,就会从左边的扬声器播放。这个左右是基于相机位置的,默认情况下是第一人称这类的相机位置,也可以是自由相机的位置。如果要让判断基于玩家,可以添加 listener 字段,并将其设为 player 字符串("listener": "player")。相机渐变
相机渐变可以让相机淡入一个指定的颜色,停留若干秒并淡出。整个屏幕都会淡入淡出为指定颜色。只能通过 /camera 命令或脚本执行这个操作,命令的语法是:
/camera <玩家或选择器> fade
/camera <玩家或选择器> fade <淡入时间> <停留时间> <淡出时间>
/camera <玩家或选择器> fade <红> <绿> <蓝>
/camera <玩家或选择器> fade <淡入时间> <停留时间> <淡出时间> <红> <绿> <蓝>
/camera 命令首先需要一个玩家,或选择玩家的目标选择器作为参数,指定淡入淡出作用的玩家。
然后是时间,默认是淡入 1 秒,停留 0.5 秒,淡出 1 秒。这三部分的时间最多分别是 10 秒。如果需要更长时间,可以用多条命令。
最后是颜色,需要指定 RGB 分量,范围是 0 至 255。默认都是 0,也就是纯黑色。不能指定透明度,透明度总是 255。
时间和颜色这两个参数可以不指定,可以指定其中一个,也可以全部指定。| 混合渐变
我们可以在一个渐变正在进行时添加另一个渐变。淡入时间以两个淡入中快的那个为准,淡出将会在两个渐变的停留时间都结束时开始,在两个渐变的淡出时间都结束时结束。
比如,运行一个淡入 2 秒,停留 3 秒,淡出 2 秒的渐变,开始运行一秒后再运行一个淡入 0.5 秒,停留 10 秒,淡出 1.5 秒的渐变。首先,第 1 秒会慢速淡入,直到不透明度为一半,之后的半秒会快速淡入,直到进入停留在纯色的状态,整个淡入会持续 1.5 秒。接下来的停留会持续 10 秒,因为第一个渐变的停留时间结束后等待着第二个渐变的停留时间结束。淡出会持续 2 秒,因为两个渐变中第一个更长。| 渐变限制
渐变也有一定限制。首先,每个渐变持续的时间必须大于等于 0.5 秒,如果时间不足,会增加停留时间来弥补。
其次,渐变一旦开始,它的颜色就不能改变,防止了全屏的颜色变化。 相机位置
我们可以用 /camera 命令设置相机或修改相机的位置、旋转角度和缓动。
这个命令首先需要一个玩家,或选择玩家的目标选择器作为参数,然后指定参数。set 参数设置相机,pos 子参数修改位置,rot 子参数和 facing 子参数修改旋转角度,default 子参数重置相机的默认值,ease 子参数缓动相机,clear 参数清空相机设置。| set
这个参数用于将玩家的相机设为指定预设,会瞬间切换到指定相机。只有两种方法可以清除这个效果,那就是 clear 参数和退出重进。如果通过其他方法试图切换视角,比如设置,会在聊天栏提示“当自定义摄像机未启用时,所选的摄像机会发生变化”;通过快捷栏更改会提示“使用自定义摄像机时无法更改视角”。但玩家的输入,比如移动和转动头部,仍然会处理。| pos
这个参数用于设置相机的位置,会覆盖相机预设的设置。它支持绝对坐标(纯数值)、相对坐标(~)和局部坐标(^),与其他命令相似。如果把相机位置设为渲染距离之外的未加载区块,相机就只能看到天空和虚空,这是不被支持的,以后可能会禁止这样做。| rot
这个参数用于设置相机的旋转角度,会覆盖相机预设的设置。它支持浮点数和 ~ 符号。如果直接利用浮点数将角度设为 ..-90 或 90..,命令不会执行。如果用 ~ 符号间接设为 ..-90 或 90..,角度会被钳制到 -90..90。| facing
这个参数用于设置相机的旋转角度,使相机看向指定位置。可以指定一个坐标作为参数,此时看向那个坐标;也可以用目标选择器指定一个实体,此时看向那个实体碰撞箱的中心。| ease
这个参数用于缓动相机,让相机从目前位置平滑过渡到指定位置。缓动的起始点总是在目前相机所在的位置。如果在从 A 点到 B 点缓动时让相机缓动到 C 点,相机将从 A 和 B 之间缓动到 C。不能缓动到第一人称、第三人称正面和第三人称相机,因为玩家可以移动,此时缓动到这些相机会很奇怪。
相机过渡的路线有 32 种选择,对应 32 种缓动函数,它们是 linear、spring 和其他函数,可以在 easings.net 查询。| default
这个参数用于取消 pos rot facing 参数的更改,将相机重设为 JSON 中定义的值。| clear
这个参数用于清除以前发送的相机命令造成的效果,回到玩家设定的视角。 相机跟随目标
可以指定相机跟随一个实体。目前这个功能只能通过 /camera 命令使用,而且必须使用自由相机。语法如下:
/camera @s target_entity <实体>
/camera @s target_entity <实体> target_center_offset <x y z>
/camera @s remove_target
target_entity 参数用于使相机聚焦在指定实体上,后面需要一个目标选择器作为参数。还有一个可选的 target_center_offset 参数,后面接一个偏移量,指定相机相对实体中心的偏移位置,介于 -100 和 100 之间。
remove_target 参数用于使相机回到正常状态。 相机跟随轨道
现在有一种新的相机预设,minecraft:follow_orbit。这种预设用于自定义第三人称相机,可以自定义一些相机设置。在它的预设里,有以下字段:| radius
设置相机与玩家的距离,以方块为单位,值在 0.1 和 100 之间。| starting_rot_x starting_rot_y
设置起始的旋转角度。| view_offset
设置相机偏移,这会把玩家移动,即使转动相机。| entity_offset
基于玩家设置相机偏移。| 其他
可以设置以下内容,但不知道如何设置:相机可以绕玩家旋转的角度; 转动相机的最大速度(度每秒); 偏角和俯仰; 相机跟随的速度; 玩家与相机是否保持同一角度。 相机瞄准辅助
在自由相机下,有时很难与方块或实体互动,于是加入了相机的瞄准辅助(Aim Assist)功能。这个功能会高亮选择到的方块,具体的高亮纹理可以通过资源包修改,文件位置如下:
方块高亮纹理 textures/ui/aimassist_block_highlight.png 类似于白色的结构空位,有黑边。
实体高亮纹理 textures/ui/aimassist_entity_highlight.png 像是四个小箭头指向一个小空心圆,有黑边。
要使用这个功能,需要配置瞄准辅助预设和瞄准辅助分类,位于行为包根目录下aim_assist文件夹下。| aim_assist_preset
在aim_assist文件夹下有presets文件夹,这个文件放在presets文件夹下。以下是我整理好的模式文档。{ "format_version": "1.21.50", "minecraft:aim_assist_preset": { "identifier": "complementary:aim_assist_preset_test", "categories": "", "default_item_settings": "", //可选 "hand_settings": "", //可选 "item_settings": { //可选 "": "" }, "exclusion_list": [ //可选 "" ], "liquid_targeting_list": [ //可选 "" ] } } 复制代码
以下是官方示例。{ "format_version": "1.21.50", "minecraft:aim_assist_preset": { "identifier": "minecraft:aim_assist_default", "categories": "minecraft:aim_assist_categories_1", "item_settings": { "minecraft:bucket": "bucket" }, "default_item_settings": "default", "hand_settings": "hand", "exclusion_list": [ "minecraft:bedrock", "minecraft:arrow" ], "liquid_targeting_list": [ "minecraft:bucket", "minecraft:oak_boat", "minecraft:birch_boat", "minecraft:spruce_boat", "minecraft:jungle_boat", "minecraft:acacia_boat", "minecraft:dark_oak_boat", "minecraft:mangrove_boat", "minecraft:cherry_boat", "minecraft:bamboo_boat", "minecraft:oak_chest_boat", "minecraft:birch_chest_boat", "minecraft:spruce_chest_boat", "minecraft:jungle_chest_boat", "minecraft:acacia_chest_boat", "minecraft:dark_oak_chest_boat", "minecraft:mangrove_chest_boat", "minecraft:cherry_chest_boat", "minecraft:bamboo_chest_boat" ] } } 复制代码 | aim_assist_categories
在aim_assist文件夹下有categories文件夹,这个文件放在categories文件夹下。以下是我整理好的模式文档。{ "format_version": "1.21.50", "minecraft:aim_assist_categories": { "identifier": "complementary:aim_assist_category_test", "categories": [ { "name": "", "priorities": { "block_default": 50, //0-100的整数 "blocks": { "minecraft:stone": 45, //0-100的整数 }, "entities": { "minecraft:allay": 25, //0-100的整数 }, "entity_default": 20 //0-100的整数 } } ] } } 复制代码
以下是官方示例。{ "format_version": "1.21.50", "minecraft:aim_assist_categories": { "identifier": "minecraft:aim_assist_categories_1", "categories": [ { "name": "bucket", "entity_default": 30, "block_default": 30, "priorities": { "blocks": { "minecraft:cauldron": 60, "minecraft:water": 60, "minecraft:lava": 60 } } }, { "name": "hand", "entity_default": 30, "block_default": 30, "priorities": { "blocks": { "minecraft:oak_log": 60, "minecraft:birch_log": 60, "minecraft:spruce_log": 60, "minecraft:jungle_log": 60, "minecraft:acacia_log": 60, "minecraft:dark_oak_log": 60, "minecraft:mangrove_log": 60, "minecraft:cherry_log": 60 } } }, { "name": "default", "priorities": { "blocks": { "minecraft:lever": 60, "minecraft:oak_button": 60, "minecraft:birch_button": 60, "minecraft:spruce_button": 60, "minecraft:dark_oak_button": 60 } } } ] } } 复制代码
这些文档中的具体细节还需要进一步研究,目前官方没有放出相关解释。而且目前(1.21.50.25)还不支持实体的高亮,官方承诺以后会支持。 后记
这一期,我们讲解了相机系统。相机系统还在频繁更新,稳定后此页面可能会更新。