Skip to content
是封面

坐标系与坐标参数相关的基础理论

摘要

Minecraft的游戏世界是三维的。在编写命令的时候,有时需要确定这个命令的作用对象需要的位置参数。这样的参数被称为坐标。本文列举了命令系统使用的坐标参数格式,对其性质及用途作理论上的阐述。

引言

Minecraft使用的空间直角坐标系是右手坐标系。在这种空间直角坐标系中,x轴和z轴所反映的是水平方向上的位置,y轴所反映的是垂直方向上的位置。其中,x轴的正方向指向正东,而z轴的正方向指向正南。 适用于Minecraft的空间直角坐标系 在多数情况下,可以用三个参数来表示某一点的位置,这是一个有序的实数三元组:

<x> <y> <z>

比如,用数学方法表示的点(0,4,4)在一些命令参数中直接表示为0 4 4

空间直角坐标系中有两个点A(124.5,76,64.29)B(10.003,80,33.33),则B点在水平位置上位于A点的什么方向? Bx坐标位于Ax坐标的负方向,因此B点在东西方向上位于A点的西方;Bz坐标位于Az坐标的正方向,因此B点在东西方向上位于A点的南方。综上所述,B点位于A点的西南方向。

虽然不同的坐标表示方式基本一致,但不同的命令作用的对象不同,其坐标参数类型也不完全一致,下文将梳理命令系统使用的所有种类的坐标参数。

参数类型

命令使用4种与坐标相关的参数类型:方块坐标minecraft:block_pos、三维坐标minecraft:vec3、平面方块坐标minecraft:column_pos和二维坐标minecraft:vec2。它们的关系和应用场景可以很清晰地列于下表:

一般应用于方块一般应用于非方块的游戏内容
三维minecraft:block_posminecraft:vec3
二维minecraft:column_posminecraft:vec2

方块坐标

坐标表示的是一个没有体积的点,而方块是有体积的,因此需要给方块规定一个基准点,用这个基准点的坐标来表示该对象的坐标。 Minecraft规定:大部分方块的长、宽和高均为1米,体积为1立方米。用坐标系表示这些位置时,默认了方块的边长和坐标系的单位长度在数值上相等,这意味着坐标系的基本单位为米,或称为“格”。 一个方块使用其西北下角的点作为它的方块坐标(Block position)。若一个方块的西北下角顶点坐标为(x,y,z),则该方块的方块坐标记为(x,y,z),而这个方块位于(x,y,z)(x+1,y+1,z+1)这两个坐标围成的立体几何图形之间。 用方块这个方向的顶点来表示方块坐标 由于方块的角总是位于整数坐标点,作为命令参数minecraft:block_pos的方块坐标一定是由三个整数构成的有序三元组。允许在方块坐标中使用相对坐标和局部坐标。 命令/setblock/fill/clone/fillbiome/spawnpoint/setworldspawn均使用方块坐标,除此之外,/data/item/execute中用于处理方块实体数据的子命令也使用方块坐标。

如图所示,方块坐标为0 0 0的方块为哪一个? 方块坐标例题 方块坐标严格按照西北下角顶点来计算,而正西、正北分别是x轴和z轴的负方向,因此用方块坐标指示的方块位置,永远位于实际坐标的东南方向,且在垂直方向上位于上方,在空间直角坐标系中的反映即为xyz三个坐标轴的正方向。因此方块坐标为0 0 0的方块位于第一卦限,即方块A

三维坐标

三维坐标(Three-dimensional coordinates) 是精确表示一个位置的坐标参数,命令参数类型为minecraft:vec3,用于表示坐标位置的三个元素均为双精度浮点数。三维坐标一般应用于实体,使用三维坐标的命令有/tp/teleport)、/rotate/summon/particle/playsound/damage,以及/executefacingpositioned子命令。 可以看到,上述命令大部分都是实体相关的命令,实体在使用三维坐标时,其碰撞箱底部中心点是这个实体的坐标。例如,使用命令

tp 5.0 56.0 17.0

后,玩家脚底的中心点位于(5.0,56.0,17.0),或者可以说玩家的锚点脚部位于(5.0,56.0,17.0)。 上面的例子中表示的坐标带有小数点,因为三维坐标的三个参数均是双精度浮点数。但是,这并不意味着三维坐标只能使用浮点数。例如,若使用整数形式的坐标(5,56,17)来描述玩家位置,在实际操作中,却发现这个玩家位于三维坐标(5.5,56.0,17.5)。如图,可以观察到玩家的坐标发生了“偏移”,与实际坐标有所出入。其中x坐标和z坐标都发生了“偏移”,而y坐标不受影响。 玩家坐标发生的“偏移” 这些位置的偏移都位于相对方块两条对边的中心线上,这是因为三维坐标使用了中心校准(Center correct),即使用整数形式的三维坐标,当其某一个坐标参数为nnZ)时,其实际坐标为n0.5,这样可以使得实体位置与方块位置相适应。注意中心校准仅适用于x坐标和z坐标。y坐标严格使用实际坐标。 注意这里不使用“三维坐标根据方块坐标位于方块中心”的说法,是因为三维坐标的三个参数中整数和浮点数形式可以混用,并且使用小数形式的参数严格遵循实际坐标,整数形式的参数则使用中心校准。比如,位于5 56 17.0的玩家实际位于(5.5,56,17.0)

平面方块坐标

故名思义,平面方块坐标minecraft:column_pos就是二维的方块坐标,以西北角的二维坐标作为一个方块纵列的平面坐标,两个元素均为整数。目前使用这种参数格式的命令只有/forceload

二维坐标

即只由x坐标和z坐标构成的二维坐标(Two-dimensionalcoordinates)。二维坐标的命令参数类型为minecraft:vec2,两个元素均为双精度浮点数。二维坐标若为整数,则也使用中心校准。/spreadplayers/worldborder均使用这种参数格式。、

相对坐标和局部坐标

坐标参数除了使用数字形式之外,还可以使用波浪号或脱字符表示相对或局部坐标。

相对坐标

世界坐标是以空间直角坐标系为基准的、固定的坐标体系,每一个位置都有其固定的坐标。在表示这些坐标的时候,有时候需要确定“相对位置”,即抛开固有的以原点为基准的坐标系,使用“相对偏移量”来表达一个位置相对于另一个位置的坐标,即下文所要介绍的相对坐标(Relative world coordinates)。与之相对的固定空间直角坐标系坐标被称为绝对坐标(Absolute world coordinates)。在相对坐标系中,必须要确定一个原点,这个原点通常是命令执行位置。如果命令由玩家执行,则原点为玩家所在的位置;如果命令由命令方块执行,则原点为该命令方块所在的位置。相对坐标用波浪号~和相对偏移量表示,如果是二维的坐标,那就是

~[<dx>] ~[<dz>]

如果是三维的坐标,那就是

~[<dx>] ~[<dy>] ~[<dz>]

若相对偏移量[<dx>][<dy>][<dz>]不填写,则偏移量为0,偏移量可以为负。这就相当于建立了一个以命令执行位置为原点的空间直角坐标系。例如,相对于该点正东面的3格距离可以表示为~3 ~ ~在绝对坐标系中建立的相对坐标系

一个位于点(24,55,10)的命令方块,其相对坐标~12 ~‐3 ~‐5所指的方块坐标为____________。 相对坐标规定命令方块所在的位置即为原点,在将相对坐标转换为绝对坐标时,只需要在绝对坐标的基础上做相应的加减,这个题中的方块坐标为(2412,553,105),计算可得(12,52,5)

相对坐标可以与绝对坐标混合使用。 在不使用波浪号的坐标参数中,计算绝对坐标。比如,~10 10 ~10会根据执行位置变换x坐标和z坐标,但y坐标被固定为10。 如果在方块坐标中使用相对坐标,坐标值会被向下(负无穷)取整使之与方块坐标贴合。例如,当命令执行位置为(10.5,70.2,9.1)时,方块坐标的相对坐标原点~ ~ ~取整为10 70 -10。 上述的四种坐标参数类型,minecraft:block_posminecraft:vec3minecraft:column_posminecraft:vec2均可以使用相对坐标。

局部坐标

除了相对坐标外,命令系统还有一种更加灵活的坐标,即局部坐标(Local coordinates)。局部坐标也用于表示相对偏移量,与相对坐标不同的是,局部坐标使用方向来表示偏移。同样地,局部坐标也有作为锚点的命令执行位置,由脱字符和相对偏移量的格式来表示:

^[<dx>] ^[<dy>] ^[<dz>]

局部坐标系 而局部坐标脱离了绝对坐标系规定的方向,它使用命令执行朝向作为基准。如图,使用局部坐标相当于建立了一个坐标轴方向任意的坐标系,但是坐标轴之间的正交关系不变。若执行者为玩家或其他实体,随着这些实体的视角转动,这个坐标系也跟随其视角转动。规定:命令执行朝向即为局部坐标系z轴的正方向若命令执行者为命令方块,则局部坐标系与相对坐标系无异,以南方为z轴的正方向。因此x轴正方向位于执行朝向的左边,y轴正方向位于执行朝向的上方。比如,执行朝向右边3米距离的局部坐标为^‐3 ^ ^由于局部坐标不使用绝对坐标系规定的坐标轴方向,因此局部坐标不能与绝对坐标和相对坐标混用。 如果在方块坐标中使用局部坐标,和相对坐标一样,坐标值也会被向下(负无穷)取整使之与方块坐标贴合。 但是局部坐标不能用于二维的坐标参数minecraft:column_posminecraft:vec2,只能用于三维的minecraft:block_posminecraft:vec3

其他参数中的坐标形式

目标选择器中的坐标

目标选择器原点使用一组双精度浮点数作为参数的值,共包括了xyz三个参数:

<目标选择器变量>[x=<x>,y=<y>,z=<z>]

参数的值可以为小数,位置原点的坐标不适用中心校准,所有位置原点坐标一律使用其实际坐标。用法举例:

@a[x=0,y=57,z=0]

这个选择器参数定义了精确的原点(0.0,57.0,0.0)。原点参数是可选的,三个参数均可选填。当某个坐标的参数未定义值时,则在未指定的坐标轴上使用命令执行位置。例如,定义下列参数:

@a[x=0,z=0]

由于参数y未定义,则使用命令执行位置的y坐标作为参数y的值。若三个参数均未定义值,则完全使用命令执行位置。一般而言,原点参数需要配合距离、体积、排序或数量参数使用。但是像@p这种本身具有排序功能的选择器可以单独使用原点参数,如@p[x=0,y=0,z=0]会选择离(0,0,0)最近的玩家。 原点参数不会修改命令执行位置。

对执行位置向下取整

/executealign子命令将命令执行位置的实际坐标向下取整,语法为:

align <axes> ‐> execute

其中<axes>使用了特殊的参数格式——坐标轴组合minecraft:swizzle。可以为xyz的任意不重复组合,因此像xx这样的组合是错误的。所有可用的组合有:xyzxyxzyxyzzxzyxyzxzyyxzyzxzxyzyx,一共有15种不同的组合。子命令align会将该组合中所有相应坐标轴上的坐标向下取整(即向负无穷大取整)。各坐标轴的顺序没有要求,于是像xyyx这样的组合效果完全相同。对坐标取整一共有七种情况,下面将所有的情况与15种组合对应起来:

  • 仅对x坐标取整:x
  • 仅对y坐标取整:y
  • 仅对z坐标取整:z
  • x坐标和y坐标取整:xyyx
  • x坐标和z坐标取整:xzzx
  • y坐标和y坐标取整:yzzy
  • x坐标、y坐标和z坐标取整:xyzxzyyxzyzxzxyzyx

已知命令执行者位于(12.5,76,41.3),执行下面的命令后: execute align xyz run tp ~ ~ ~ 该命令执行者的实际坐标为何? 由题意可知,该命令的初始执行位置为(12.5,76,−41.3),xyz组合使align子命令将该执行位置的x坐标、y坐标和z坐标向下取整,得到修饰后的执行位置(12.0,76.0,42.0)。可以看到,若坐标为正,则向下取整会去除小数点;若坐标为整数则不变;若坐标为负,则去除小数点后将整数位置上的数字减去1。最后处理run命令时,命令/tp会将命令执行者传送至修饰后的坐标。 同理,如果执行的命令为 execute align x run tp ~ ~ ~ 则修饰后的执行位置为(12.0,76,42.0),这里y坐标和z坐标没有向下取整。 有一点需要读者注意,align子命令不等同于坐标的中心校准,因为命令中的所有坐标均为实际坐标,所以整数坐标的表现形式为方块的边缘。在这个例子中,x坐标和z坐标均进行了向下取整,所以命令执行者被传送到了四个方块的交点,如图所示: 向下取整

虽然align子命令不等同于坐标的中心校准,但仍然可以利用align子命令对已有的实体进行手动中心校准,下面再举一个例子:

将任意坐标的命令执行者位置校准至其所在方块的中心。 可以先用align子命令对x坐标和z坐标向下取整:无论命令执行者位于其所在方块内的任一坐标,向下取整后的执行位置都是相同的,然后用/tp命令进行手动中心校准,即将命令执行者的x坐标和z坐标向正方向移动0.5格,此时命令执行者就被校准到了方块的中心点。有效的命令为: execute align xz run tp ~0.5 ~ ~0.5

参考文献

[1] https://zh.minecraft.wiki/w/坐标 [2] https://zh.minecraft.wiki/w/目标选择器 [3] https://zh.minecraft.wiki/w/命令/execute [4] https://zh.minecraft.wiki/w/参数类型

Powered by Vitepress and Github Pages