薛山
說到屏幕保護程序,或許很多年輕人都會覺得不明所以,作為CRT時代的標配,當你長時間不使用電腦但又不關機的時候,屏幕保護程序會主動顯示一些預設的動態(tài)畫面,不讓屏幕長期顯示同一畫面而導致熒光物質老化。但在進入LCD時代之后,屏幕保護程序反倒會加大背光工作壓力,因此漸漸就淡出了歷史舞臺。不過,作為一個從Windows 98開始用電腦的“小萌新”,屏幕保護程序就是我電腦萌芽階段的一個特殊記憶,尤其是那個在三維空間里不斷自動生長的水管,讓人印象深刻,那么在Blender里,我們是否能復刻這個經典的3D屏保效果呢?
3D水管這個屏保最大的特點就是沿XYZ方向隨機增長,這個設計如果是以傳統(tǒng)的建模概念來說,最直觀的方法就是只能先建好模型,再利用“建形”修改器來還原這個模型的生長過程。但這個方法有一些弊端,其中最明顯的就是形態(tài)固定,因為你是先完成了建模,再進行還原,所以無法實現真正的隨機化,而Windows XP的3D水管屏保每次都是不一樣的,因此,最好的復現方法還是利用幾何節(jié)點,也就是通過數學手段來解決這個問題。
注意,這次的教程需要用到3.1及以上版本的Blender,3.0版會缺少一個重要的節(jié)點。而在打開Blender之后大家可以直接利用默認立方體來新建幾何節(jié)點,因為水管的生長在二維空間來看就是線段的增長,因此我們需要使用“網格直線”來作為基礎,然后讓它每一個頂點的位置都以1個單位,隨機向正負XYZ方向移動。
邏輯上梳理清楚之后,接下來就該想辦法操作了。因為是隨機方向,所以我們需要一個“隨機值”來作為算法的起點,總計有6個移動方向,我們只需要讓這個隨機值除以6,就能在6個方向中隨機選擇其一,因為每一個頂點都會計算一次,所以理論上就能讓每一個頂點都隨機沿正負XYZ方向移動了。
所以,如圖1所示,我們需要先引入6個矢量,代表了XYZ軸各自±1單位的移動量,接下來就需要利用“隨機值”,通過每六分之一個單位,也就是1/6=0.167來進行“吸附”,這會讓每次在0到1之間生成的隨機值都是0.167的整數倍,相當于做了一次六選一。
接下來我們只需要按順序,讓每兩個矢量進行混合,并使用“相等”來讓它們以1/6、2/6、3/6、4/6、5/6作為系數,這個步驟就是讓它們按生成的隨機數來進行匹配,在六個矢量方向中選擇一個,具體設置可參考圖2。
在得到這個看起來很復雜的六選一算法后,我們需要在網格直線后添加一個“設置位置”,它的功能就是調整每個頂點的位置,這時候如果我們直接把圖2得到的結果輸出到“位置”,增加網格直線的數量后會得到一個立體的菱形,而不是一個不斷增長的線段,這就是為什么我們要用3.1版Blender的原因,因為從這個版本開始才有“累積場”這個節(jié)點,它的作用就是讓每一個頂點的矢量增加都建立在前一次計算之上,如果沒有這個節(jié)點,在每一個頂點的矢量計算之前都會把位置重置回原點,所以圖像才會呈現為一個立體菱形,而在如圖3所示正確設置“累積場”之后,再增加網格直線的頂點數量,就會得到我們想要的效果了。
FpddZsKpd84dix4sK67FZFOr1vZFat38Rb6/MRoKP1s=
最關鍵的是我們可以通過修改“隨機值”的隨機種,獲得完全不同的走向圖,這就實現了我們最開始的目的:隨機變化的水管增長。
剛剛我們實現了水管的走向,但這時候我們并不能真正地看到“水管”,所以還需要繼續(xù)在幾何節(jié)點里進行設置,首先需要使用“網格→曲線”和“曲線→網格”,再利用“曲線圓環(huán)”作為“輪廓曲線”來呈現水管形狀。
但這時候你可能會發(fā)現水管的細節(jié)有一些瑕疵,這是因為曲線精度不夠所致,所以我們需要在“網格→曲線”和“曲線→網格”之間添加一個“細分曲線”來解決這個問題。
如果你也是Windows XP老玩家的話,應該還記得這個“水管”并非純粹只是管道,在管道轉彎位置其實還有一個小圓球,那這個東西如何添加呢?其實也很簡單,因為我們之前通過算法,已經得到了一條不斷隨機彎折的線段,只需要在這條線段的每個頂點上,通過“實例化于點上”來放置一個經緯球或棱角球,問題就得以解決了,再給“管道”和球體各自添加材質,最終效果就實現啦,具體可參考圖4。
如果要在Blender 3.1版本之前來做這個經典的屏保效果,可能還真只有先建模這一個方法可行,而幾何節(jié)點的出現讓這個過程變得更加簡潔明了,而且還有了更隨機化的效果,的確非常有趣。同時需要注意的是,幾何節(jié)點的功能其實一直都在快速更新中,很多技巧都是新版本更迭后才出現的,這也就需要大家保持專注力,多研究新版本的特性,才能學到更多有用的玩法。