第五章 坐标
你创建了你人生第一个生存存档,打算一直玩下去。进入游戏,你发现你出生在了一个大草原,太阳刚刚从地平线升起,阳光照进远处炊烟袅袅的村庄里,村民们都开门前去上班。
很快,你撸了一棵树,用泥土搭建了一个房子。但时间过得很快,10分钟的白天很快就过去。当太阳的最后一抹光消失在天边,你突然意识到——我的泥土房子呢?
此时你已经跑到了一个积雪的桦树林里,周围看起来没有一丝人烟。左手边有一座大雪山,雪山山腰上有一个矿洞。往前走是一个悬崖,从悬崖上眺望,只能看到无边无际的树林和缓缓升起的圆月。
你往回跑,但僵尸骷髅已经开始生成。它们在你背后穷追不舍,你加速奔跑,但很快饥饿值只剩三个鸡腿——你跑不动了。
空中缓缓飘落下点点雪花,你此时已经走投无路。望着正朝你缓缓走来的僵尸和在不远处正拉弓的骷髅,你突然心生一计——你朝着脚底挖了3格,然后把头上用泥土填掉,这太完美了!
时间不知道过了多久。当你挖开泥土的时候,清晨的第一缕阳光照进了洞中。你刚想欢呼,但随即而来的箭清零了你最后一滴血。死前你看到了这只箭的主人——一个躲在桦树下的骷髅。
现在我们来研究一下你为什么会这样。答案其实非常的简单——你迷路了。
为什么你迷路了呢?因为你没有记录你房子所在的位置。
那么该怎么确定你房子的位置呢?
我们知道,现实世界中,主观的确定位置方式是“上下左右前后”,客观的确定位置方式是“东南西北”。在地理课上,你还会学到目前为止最常用的确定位置的方式——经度和纬度。
经度和纬度为什么可以确定位置呢?其实,经度和纬度的本质其实是球面坐标系。
我们平常接触到的坐标系是平面直角坐标系。但不管是平面直角坐标系还是球面坐标系,它们都是在一个面上的坐标系,即二维坐标系。二维坐标系中只有两个数轴:x轴和y轴,它们互相垂直,且共用一个原点。平面坐标系的两个数轴一同使用可以表示平面上任何一个点。
这就是一种确认位置的方式。
现在我们可以尝试使用平面直角坐标系来确定你在MC中的位置。我们先设定一个原点,比如原点就在你房子,然后设定一个单位长度就是一个方块的边长,X和Y轴互相垂直且平行于每个方块的边缘,整个坐标系所处的平面平行于Minecraft大陆。此时你就会发现,你死的地方的坐标是:
(716,-27)
这太令人震惊了。如果你早一点知道的话,或许就不会跑那么远,也不会找不到回去的路了。
但或许我们并不需要这么麻烦去自建一个坐标系。因为MC本身就自带一个坐标系。这个坐标系有三个轴。一般来说,有三个轴的坐标系,是三维坐标系(专业说法为空间坐标系)。在三维坐标系中,三个轴分别是X、Y和Z。Minecraft坐标采用的是三维坐标系中的“空间直角坐标系”。空间直角坐标系通俗的来说就是在平面直角坐标系上加入了一个垂直于平面的Z轴,用于确定点所在的高度(或宽度)。比如,在经度和纬度已经确定的情况下,再加上一个海拔高度,就可以确定你是在天上坐飞机还是在地下采矿了。
MC自带坐标的三个轴表示的分别是:
X坐标——东(+)西(-)方向
Y坐标——海拔高度
Z坐标——南(+)北(-)方向
需要注意的是,在真正的空间直角坐标系中,高度可能是Y轴,也可能是Z轴。
似乎我们一般用X和Z轴就可以了。确定高度的Y轴,除了确定是在天上地下,还有啥用呢?
你如果到处跑来跑去,会发现主世界的海平面都是在Y=64的地方(JAVA早期版本是Y=63);翻翻论坛,你会发现大家都在说钻石矿在Y=12层挖钻石最好挖;挖矿时掉进岩浆,你会发现Y=11层及以下的矿洞都被岩浆填满。(听说1.17最新快照版本世界最下面已经到了Y=-64的地方了)
每个方块、实体都可以用坐标精准定位。而且,Minecraft的坐标可以精确到小数点后面很多位。
说了这么多,那么如何查看坐标呢?Java版需要按下F3(或Fn+F3)打开调试面板,基岩版可以在设置界面找到“显示坐标”,打开即可,只不过基岩版需要管理员权限,Java版所有玩家都可以。
然后你就会发现你的泥土房子的坐标是:
(62,68,21)
但坐标就只有这一个用途吗?其实不然。
在指令方面,坐标可以确定指令执行的位置、放置方块的地点、传送的地点、生成实体的位置等等。
MC自带的坐标我们已经了解得差不多了。但如果我们在此坐标的基础上,继续使用刚才我们以房子为原点的坐标并将其改善为类似于MC的空间坐标系会怎么样?
其实不会怎么样,只是会上这本书。
但如果你不以房子为原点,而是以你自己为原点会怎么样?
你会发现,由于你会移动,导致以你为原点的三个坐标轴也会移动,最后导致以这个坐标标记的房子,其坐标的三个数值也会变化。
但你有没有发现,不管你怎么移动,你客观上的南面十米还是南面十米,并不会因为你朝南面走十米就变成南面零米了。
在MC中,这种坐标有一个特殊的名字,叫做“相对坐标”。
在相对坐标中,虽然东南西北仍然是固定的,但原点却不是固定的。就比如上面的“南面十米”,你朝南面走十米,你南面十米的方块也就变化了。
那如何表示“南面十米”呢?
~~~10就可以了。
表示相对坐标,需要在我们刚才了解的MC自带坐标的基础上,再在数字前面加上“~”,如果数字为0直接把0省略。比如往东6米,再往下1米,最后往北12米,就可以表示为:
~6 ~-1 ~-12
注意了,顺序不能乱排,目前的这两个坐标都是按照XYZ的顺序排的。而且,XYZ三个值要用空格分开(基岩版没那么严格,JAVA版不用空格分开会报错)。
相对坐标是这样的。但既然这个坐标叫相对坐标,那么之前我们了解得那个坐标叫啥呢?
绝对坐标
相对坐标和绝对坐标通常情况下是可以配合使用的,因为不管你怎么动,XYZ三个轴还是能跟绝对坐标的XYZ对上的。举个例子:
37 ~15 ~-2——X=37的地点,再以你的绝对Y坐标往上15格,然后再以你的绝对Z坐标往北2格的方块。
如你所见,配合的时候,实际上就是将玩家的绝对坐标XYZ值提取出来,再加上波浪号后面的数字。直观的表现为我们把你的绝对XYZ坐标值分别设定为x、y和z,然后代入:
(37,y+15,z-2)
就是这么个东西。
(注:相对坐标的原点实际是因指令而异的,在大部分情况下原点即是指令执行的位置,但也有特殊的情况,如Java1.13版本之前的/tbr /指令。)