首頁 游戲

Minecraft指令手冊

第七十五章 局部坐標(biāo)與執(zhí)行朝向

Minecraft指令手冊 你好MC 570 2020-02-12 18:13:44

  (本章于2022年7月18日重寫)

 ?。ńㄗh閱讀本章的讀者需具備一定的空間想象能力,并預(yù)先準(zhǔn)備好筆和草稿紙,或一個3D畫圖軟件)

  本章以及接下來兩章原本是講execute的條件子命令和存儲子命令的,結(jié)果本書第一次大修中這些內(nèi)容在前面幾章講完了,這幾章就空出來。

  所以這一章,我們就來研究一下:局部坐標(biāo)與執(zhí)行朝向的關(guān)系。

  在第五十九章『更深入地了解坐標(biāo)』中,我們了解到局部坐標(biāo)是以執(zhí)行者的頭為原點,但其實這個觀點是完全錯誤的。要想糾正這個錯誤,我們就得了解到局部坐標(biāo)的本質(zhì)。

  局部坐標(biāo)的本質(zhì)是什么呢?簡單來說,局部坐標(biāo)就是一種基于相對坐標(biāo)并受執(zhí)行朝向影響的一種坐標(biāo)。局部坐標(biāo)的原點在相對坐標(biāo)的基礎(chǔ)上計算而成,三個坐標(biāo)軸根據(jù)執(zhí)行朝向不斷改變其傾斜角度。

  為了能夠更好理解局部坐標(biāo)的本質(zhì),我們可以以執(zhí)行地點為圓心O,任意實數(shù)r為半徑,畫一個處于水平面上的圓,這個圓我們可以稱之為『水平朝向圓』,用來代表水平旋轉(zhuǎn)角度。然后,我們再以同樣的點O為圓心,同樣的r為半徑,畫一個和絕對y、z坐標(biāo)軸處于相同平面上的圓,這個圓我們可以稱之為『垂直朝向圓』,用來代表垂直旋轉(zhuǎn)角度。

  畫出來后,我們就會發(fā)現(xiàn)這兩個圓組成了一個球體,這個球體我們可以稱之為『朝向球』。(注:這些名詞都是作者自己編的)

  在這個『朝向球』中,『水平旋轉(zhuǎn)圓』和『垂直旋轉(zhuǎn)圓』的邊有兩個交點,這兩個交點就分別代表著(180°,0°)和(0°,0°)這兩個特殊的旋轉(zhuǎn)角度。由于這兩個交點所代表的旋轉(zhuǎn)角度很特殊,我們就將這個『朝向球』稱之為『標(biāo)準(zhǔn)朝向球』,意指這個朝向球代表著標(biāo)準(zhǔn)的、默認(rèn)的朝向。

  在Minecraft中,命令方塊執(zhí)行指令時,它的朝向球就是這樣子的,因為本身其沒有朝向,所以默認(rèn)采用『水平朝向正南』的朝向來執(zhí)行指令。

  但是在玩家身上呢?甚至在其他實體身上呢?由于實體的朝向會不斷改變且不標(biāo)準(zhǔn),所以每個實體朝向球內(nèi)的『水平朝向圓』和『垂直朝向圓』并不一定處于水平面和絕對yz坐標(biāo)的平面上,而是有一個偏差的角度。

  比如說這位玩家,他的水平旋轉(zhuǎn)角度為76°(南偏西76°),垂直旋轉(zhuǎn)角度為-27°(水平向上27°)。我們以這位玩家的位置作為圓心O,以任意實數(shù)r為半徑,畫出的『水平朝向圓』所在的平面和水平面的夾角為27°,畫出的『垂直朝向圓』所在的平面和絕對yz坐標(biāo)軸所在的平面的夾角為76°(或104°)。

  不難發(fā)現(xiàn),在這種不標(biāo)準(zhǔn)的朝向球中,『水平朝向圓』傾斜的角度是由『垂直旋轉(zhuǎn)角度』決定的,而『垂直朝向圓』偏差的角度是由『水平旋轉(zhuǎn)角度』決定的,兩者是互相影響的關(guān)系。

  如果你讀懂了上面的內(nèi)容,那么恭喜你,我們現(xiàn)在可以嘗試加點兒料來切入主題了。如果你沒有讀懂,也沒事,畫點圖,或者搜一搜和上述概念很類似的『天球』,了解了解,你大概也就懂了。

  我們還是以剛才那位玩家的朝向球為基礎(chǔ),你會發(fā)現(xiàn)在這個朝向球中也有兩個交點,分別代表著(76°,-27°)和(-104°,27°)的朝向,前者是玩家正面的朝向,后者是玩家背面的朝向。我們設(shè)前者為A點,后者為B點,過AB點作直線AB,這條直線AB必定會過圓心O點。

  現(xiàn)在,我們把這條直線AB當(dāng)作是一個原點是O的坐標(biāo)軸,向A點方向為正方向,向B點方向為反方向。這條坐標(biāo)軸是什么呢?就是這名玩家局部坐標(biāo)的z坐標(biāo)軸!

  然后,我們隱藏掉『垂直朝向圓』,只看『水平朝向圓』和z坐標(biāo)軸。我們能夠看見z坐標(biāo)軸和圓的邊有兩個交點,這兩個交點也就是上面的A點和B點。

  我們過圓心O作z坐標(biāo)軸的垂線,分別交『水平朝向圓』的邊于C、D兩點。這個垂線也就是這名玩家局部坐標(biāo)的x坐標(biāo)軸。那么這個x坐標(biāo)軸的正方向在哪里呢?你當(dāng)然可以通過左正右負(fù)判斷出來,但是這樣子也過于淺顯了一些。我們必須要找到C點和D點這兩點分別的含義,才能確定x坐標(biāo)軸的正方向在哪里。

  由于x軸和z軸互相垂直,因此這里就形成了四個直角三角形——∠AOC、∠AOD、∠BOC和∠BOD。由于這四個角都是圓心角,所以我們就可以得到它們對應(yīng)的弧AC、AD、BC、BD的長度都是90°。

  別忘了,這里的圓是『水平朝向圓』,所以這里弧長的實際意義都是水平旋轉(zhuǎn)角度。在這邊,我們把『水平朝向圓』所代表的旋轉(zhuǎn)角度當(dāng)成是相對水平旋轉(zhuǎn)角度,A點為0°點,順時針增加度數(shù),因此我們就可以得到A、B、C、D四個點分別代表的度數(shù):

  A:0°

  B:180°

  C:90°(或270°,看你是怎樣標(biāo)的)

  D:270°(或90°)

  現(xiàn)在我們得到了這四個點所代表的『相對水平旋轉(zhuǎn)角度』的度數(shù)。那問題來了,這個度數(shù)的實際意義是什么?

  A為0°,代表著正前方;B為180°,代表著正后方;C為90°(或270°),代表著正右方向;D為270°(或90°),代表著正左方向。而據(jù)我們所知,局部坐標(biāo)x軸的正方向是向右,所以在這邊,x坐標(biāo)軸朝向D點(或C點)的方向為正方向。

  接下來,我們來看看『垂直朝向圓』,把最后的y坐標(biāo)軸也畫出來。還是故技重施,過圓心O作z坐標(biāo)軸的垂線,分別交『垂直朝向圓』的邊于E、F兩點,這個垂線也就是這名玩家的y坐標(biāo)軸。仔細(xì)觀察E、F點,想象一下當(dāng)玩家朝向改變時,E、F點會怎么運動。你會發(fā)現(xiàn)E點(或F點)不管怎么運動,都不會超出『垂直朝向圓』上代表著垂直旋轉(zhuǎn)角度為0°~-180°的圓弧,也就是說不會跑到過O點水平線以下的位置。所以,這個y坐標(biāo)軸朝向點E(或點F)的方向為正方向,朝向點F(或點E)的方向為負(fù)方向。

  如果你能夠理解上面的內(nèi)容,那么恭喜你,你已經(jīng)很清楚局部坐標(biāo)與旋轉(zhuǎn)角度的關(guān)系了。

  但局部坐標(biāo)的原點呢?

  局部坐標(biāo)的原點默認(rèn)是執(zhí)行者的腳部坐標(biāo),也就是執(zhí)行地點。但我們可以通過execute指令來改變執(zhí)行朝向的基準(zhǔn)部位到眼睛,來改變局部坐標(biāo)的原點位置。那么改變之后,局部坐標(biāo)的原點會有什么變化呢?讓我們來看看下面幾條指令:

 ?、?execute as @s positioned 50.0 -60 50.0 anchored eyes run tp @s ^^^

 ?、?execute as @e[type=cow,limit=1] positioned 50.0 -60 50.0 anchored eyes run tp @s ^^^

  運行第一條指令,你會發(fā)現(xiàn)你被傳送到了(50.0,-58.38,50.0),y坐標(biāo)并不是-60,而是抬高了1.62米。但如果我們運行第二條指令,你會發(fā)現(xiàn)牛被傳送到了(50.0,-58.7,50.0),僅僅抬高了1.3米。所以說,當(dāng)基準(zhǔn)部位改變時,游戲會根據(jù)當(dāng)前指令的執(zhí)行者來判斷眼部坐標(biāo)的具體位置,而不是一定就抬高一個固定的值。如果執(zhí)行者不是一個實體,那就沒有眼睛,將不會對執(zhí)行朝向的原點以及局部坐標(biāo)的原點有任何的變化。

  這就是局部坐標(biāo)與執(zhí)行朝向的關(guān)系。需要注意的是,在tp和teleport指令中,局部坐標(biāo)的旋轉(zhuǎn)角度和原點是分家的——旋轉(zhuǎn)角度會采用傳送目標(biāo)的旋轉(zhuǎn)角度,而原點會基于執(zhí)行地點計算出來,兩者的來源并不一樣。

  這就是本章的全部內(nèi)容了,你讀懂了嗎?

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進(jìn)入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設(shè)置
設(shè)置
書架
加入書架
書頁
返回書頁
指南