Blender 3.4 用幾何節(jié)點程序化生成潘多拉地形

幾何節(jié)點和Shader節(jié)點的不同
某個Shader 節(jié)點產(chǎn)生的數(shù)據(jù)可以自由地在不同節(jié)點間傳遞、組合、嵌套,這是因為shader節(jié)點中所有的數(shù)據(jù)本質(zhì)上都是函數(shù)(對于任意的點M(x, y, z),都可以計算出任意數(shù)據(jù)在這一點的值 [ 在blender中,不存在的值?= 0 (如1/0 = ln 0 = 0) ] ,而這些函數(shù)都定義在整個三維實數(shù)域內(nèi)。
但是,幾何節(jié)點有明確的操作對象 -- 幾何體,更確切地說,是幾何體的每一個頂點。相信很多小伙伴都跟我一樣,看到過這樣的紅色虛線。

警告出現(xiàn)的原因就是執(zhí)行操作所引用的數(shù)據(jù)并不屬于操作對象。就好比計算蘋果下落軌跡,卻引用了梨子的位置或香蕉的初速度。與shader對比,我們可以發(fā)現(xiàn),幾何節(jié)點的數(shù)據(jù)依托于幾何體而存在:對于某個數(shù)據(jù)A,幾何體的每個頂點都存儲了一個A的值。如下:

Position屬于attribute的一種。attribute節(jié)點提供了一個輸入的端口。當(dāng)某個attribute “B”被引用在Set Position節(jié)點末端時,Blender會逐一查看每個頂點存儲的B值并以這個值為輸入通過運算節(jié)點對這個頂點進行位置變換。
應(yīng)用案例
在生成山峰時,可以計算山峰中心到被移動點A的距離作為自變量,接入一個減函數(shù),將函數(shù)值作為點A在Z軸移動的值:

然后,對找到的函數(shù)值進行修飾,如加上隨機函數(shù)值:

最后將組合后的函數(shù)值接入z軸偏移量:

在這個例子中,我們引用的幾何體數(shù)據(jù)是點的位置信息(position input)。通過計算每個點到山峰中心的距離,我們獲得了每個點在幾何體變形成山峰后的基礎(chǔ)高度;通過將點坐標(biāo)接入噪波Noise和馬氏分型Musgrave,我們獲得了每個點在基礎(chǔ)高度附近的隨機偏移量。最后,將二者相加得到組合函數(shù),并接入set position節(jié)點,目標(biāo)幾何體就真正變成了山峰的樣子。
潘多拉地形構(gòu)成

浮島
浮島的單體由棱角球icosphere經(jīng)三步變形而來:

首先是下方倒置山峰:

其次是上方山峰:

最后是水平方向的噪波處理:

在得到單體浮島后,在浮島分布的區(qū)域生成隨機點,并用instance on points節(jié)點將浮島在這些點處生成:


山峰
山峰由網(wǎng)格grid變形而來。每個點的z軸坐標(biāo)偏移如上文案例中所示。


藤蔓
藤蔓是比較復(fù)雜的部分,涉及到attribute的賦值和引用。
先在浮島上取若干隨機點作為藤蔓起點,再將每個點依法線Normal進行射線映射Raycast,終點即為藤蔓另一端點。將網(wǎng)格體直線Mesh Line作為Instance在每個點處生成,并根據(jù)Raycast結(jié)果校準(zhǔn)長度。將隨機點節(jié)點自帶的rotation輸出賦給instance的rotation,使網(wǎng)格線和Raycast的方向相同。網(wǎng)格線的細分程度越低,藤蔓曲線就越粗糙。

值得注意的是,此處的position輸入最終在instance on point被應(yīng)用。因此“Position”對應(yīng)左下節(jié)點生成的隨機點的坐標(biāo)。
接下來使藤蔓彎曲:
定義兩個新的Attribute“起點”和“終點”(注意要用Instance類型),分別存儲每條藤蔓的起點和終點
Realize Instance將在不同點處生成的多個幾何體合并成同一個幾何體,但保留Instance類型的attribute并轉(zhuǎn)為point類型
引用兩個Attribute,用起點到藤蔓上一點的距離除以藤蔓長度作為自變量x(x在0到1之間),定義y = x * (x - 1) * k,將y作為該點z軸的偏移量,k即是下垂程度

最后,將藤蔓曲線變成真正具有粗細程度的網(wǎng)格體:

注意到存在部分豎直的藤蔓,這是為什么呢?
植被
在法線向量Z值大于0或小于0的區(qū)域分別生成隨機點,并將不同植物作為instance分別應(yīng)用在所有點處。

為了節(jié)省性能,我在此直接引用了簡單建模的樹木模型。我做過樹木生成的節(jié)點組,但是僅僅單棵樹木已經(jīng)讓blender有明顯卡頓。倘若那個節(jié)點組進入這個場景成為樹木的幾何體,blender許是會崩潰,且我的電腦大抵是要陪葬的。

如果看的人多,我會再寫一篇文章分享樹和下垂藤蔓的全幾何節(jié)點生成方式。背景的星球是我另外做的“菈妮群星”場景的資產(chǎn),如果對此感興趣的小伙伴多的話我也可以出一期相關(guān)的shader節(jié)點教程。
(本文中所有的 “值”?并不特指數(shù)字,而是包括blender所有能用的數(shù)據(jù)類型,如向量vector、值value、布爾bool、顏色Color等)
PS:發(fā)教程視頻沒人看,那就簡單寫個專欄分享一下自己的blender學(xué)習(xí)經(jīng)驗叭。