使用 WorldEdit 快速塑造空島底部形狀

前言
撰寫本文出于?TeaCon 2023 展館建設的實際需求。由于場地的初始狀態(tài)是完美的虛空,視情況,可能需要建設浮島使建筑有所憑依。
我將介紹一種使用 WorldEdit 的 //generate 指令快速塑造空島底部形狀的方法。需注意:
1. //generate 指令用于從無到有地生成結構。因此,如果您的空島已經(jīng)存在,只是尚無繼續(xù)雕琢的思路,本文恐怕幫不上什么忙。
2. 使用本文方法生成的,或可稱為「刻板印象中的」空島底部,整體上是一座倒懸的、有隨機起伏的山峰,雖然不同參數(shù)設置可能對結果有巨大影響。
3. 只有形狀是本文關注的主題。使用材料、后續(xù)的修葺與裝飾皆取決于您的審美。
前置知識
//generate?指令的使用方法是://generate <圖案> <表達式>?。//generate 可縮寫為 //g。
為方便起見,本文總是使用石頭(minecraft:stone)傳入?<圖案> 參數(shù)。
對于選區(qū)內(nèi)的每個位置,其坐標的 x, y, z 分量會傳入 <表達式> 進行計算。若返回結果為真,則在該位置設置方塊。
默認情況下,每個位置的 x, y, z 并非它們在世界中的坐標,而是線性映射至? 范圍內(nèi)的坐標,即矩形選區(qū)八個頂點的坐標可認為是?
?,且原點位于選區(qū)中心。這些默認行為可以修改,但這并非本文討論的范圍。
指令模板
本文使用如下形式的指令創(chuàng)建空島底部:
//generate minecraft:stone n = perlin(<種子>, x, 0, z, <頻率>, <倍頻數(shù)>, <持續(xù)度>); r = 1 - <縮放函數(shù)>;?-y < <放大倍率>*n*r - 1
以下是一個可用的例子:
//generate?minecraft:stone?n?=?perlin(435,?x,?0,?z,?2,?2,?0.75);?r?=?1?-?(x^2 + z^2);?-y?<?2*n*r?-?1

下面將分解該指令中表達式的構造過程,并逐參數(shù)講解。
利用柏林噪聲生成隨機起伏的地形
讓我們從生成一片上表面的起伏地形(類似山地)開始。WorldEdit 提供了 perlin 函數(shù)生成柏林噪聲,為生成簡單的隨機起伏地形,可以使用:
//generate?minecraft:stone?n?=?perlin(0,?x,?0,?z,?1,?1,?0);?y?<?n?-?1

perlin 的第一個參數(shù)是 <種子>,相同的種子總是給出起伏模式相同的地形。可多加嘗試,找到最符合需求或觀感的種子。由于 perlin 返回的值大部分落在? 范圍內(nèi),暫且在最后將 n 的值減去 1,使地形的起伏程度相對整體高度更明顯。
perlin 的第二個至第四個參數(shù),此處使用了「x, 0, z」,指示該噪聲是二維的,與 y 無關。這保證產(chǎn)生的地形不會包含空中連廊或者洞穴等結構。0 也可改成其他常數(shù)。
第五個參數(shù),稱為?<頻率>,決定了噪聲地形的起伏有多密集。<頻率>?的影響見下圖。

第六個參數(shù)稱為 <倍頻數(shù)>。通俗而言,倍頻數(shù)若為 n,則意味著將會額外產(chǎn)生??個更高頻率的小噪聲(「倍頻」)疊加在原始的噪聲上。這些小噪聲會增加地形起伏的細節(jié),<倍頻數(shù)>?越高,地形越具備更細碎的分形特征。<倍頻數(shù)> 的影響見下圖。

最后一個參數(shù)稱為 <持續(xù)度>,僅在?<倍頻數(shù)> 大于1時有實際效果,一般設置為??范圍內(nèi)的數(shù)。<持續(xù)度>?決定后續(xù)倍頻對起伏程度的影響如何隨著頻率增大而衰減,1 為完全不衰減。若 <倍頻數(shù)>?較大而倍頻幾乎不衰減,則會在原地形上產(chǎn)生大量尖刺及豎井,大部分情況下有礙觀瞻。<持續(xù)度>?的影響見下圖。

除柏林噪聲外,WorldEdit 提供的 ridgedmulti 函數(shù)也可用于此步驟。 噪聲更適合用于制造類似山脊的結構。下圖是例子。

柔化及切削出空島底部的形狀
目前為止,通過噪聲函數(shù)生成的起伏地形仍然保持著與選區(qū)相同的形狀(矩形),但矩形在很多時候過于僵硬,不一定能滿足展館建設的要求。為得到「刻板印象中的」空島底部形狀,需要將其切削,并使邊緣區(qū)域均勻變薄、起伏柔化。
為達成此目的,需尋找一個自變量只包含 x 和 z 的?<縮放函數(shù)> r,乘以當前的噪聲 n,讓噪聲的值在靠近中心的位置為1左右、邊緣不需要的位置迅速下降至0以下。您還記得默認情況下 y 的實際取值范圍是??嗎?這樣一來,若最后一個表達式是 y?<?r * n?-?1?,就可以讓這些邊緣區(qū)域實現(xiàn)被裁剪的效果。n = 0 的位置則成為空島的邊緣。
與原點的水平距離函數(shù)???可以滿足要求,它將形狀限制在一個錐體內(nèi)部,邊緣是圓,如下圖所示。

如果錐體太過尖銳,可以試試離原點的水平距離平方 ?,它將形狀限制在一個拋物面內(nèi),邊緣同樣是圓,如下圖所示。

接下來是我個人在建設 Caupona 展館時使用的 <縮放函數(shù)>,衡量的是離原點的水平??范數(shù),即?
?。它的邊緣類似一個圓角矩形——只是類似。

復雜一些的函數(shù)也沒有問題。下圖使用的是??。

實際上,只要您能構造出來,總能用不同的?<縮放函數(shù)> 將地形切割并塑造成不同的形狀。
翻轉地形
您會注意到,「刻板印象中的」空島底部——帶有隨機起伏的錐形——已經(jīng)大致成型了。當然,根據(jù)選用的噪聲及 <縮放函數(shù)>,不一定是錐形。無論如何,最后一步就只是將其翻轉過來,這只需要將最后一個表達式的?y?<?n*r?-?1 改為?-y?<?n*r?-?1?即可實現(xiàn)。
如果希望起伏的程度更大,則可以修改成 -y?<?<放大倍率>*n*r?-?1?的形式。需注意的是,乘以較大的?<放大倍率> 可能使右側超過?-y 的取值范圍,導致地形被裁剪。

后續(xù)雕刻及修葺
單一材料組成的空島底部自然不美觀,需要您進一步修葺及雕刻,以及替換一些材料。設置合適蒙版的刷子在這項工作中很有用,不過這就不是本文所關注的了。
如果您看到了這里,預祝展館建設順利。
關于本文
本文的文字部分依 CC0 協(xié)議進入公有領域。不過,圖片主要來自 Minecraft 游戲截圖,并使用 Wolfram Mathematica 生成了數(shù)個函數(shù)圖像。在特定場合使用這些圖片是否會構成對有關方面的侵權,有待使用者核實。
