周丁丁
(博興縣公用事業服務中心,濱州 256500)
當今,在風景園林學科中,不管以圖片的方式還是其他多媒體(如虛擬現實)的方式展示設計方案,三維模型的制作一般都是必不可少的環節。在三維模型的制作中,Trimble SketchUp(文中簡稱SketchUp)彌補了項目可視化的不足,以“人人可操作的3D軟件”的優勢得到了從業者廣泛的應用。
園林植物是風景園林的重要組成部分,對于三維模型中園林植物的制作,在SketchUp中通常是運用以下兩種方法:
(1)將樹制作成SketchUp中的組件,再將這個組件通過復制或者類似復制的陣列操作來實現。
(2)通過SketchUp與其他軟件的文件交換,通常是在AutoCAD中將樹制作成一個塊,并將這個塊通過復制或者陣列再導入SketchUp中,將這個塊(SketchUp跟AutoCAD的文件交換中,將AutoCAD中的塊轉化為SketchUp中的組件)通過SketchUp中的組件替換功能實現。
這兩種方法中,其他的樹其底層都是通過對同一棵樹的復制來繪制的,所以形成的結果就是同一種樹的大小和角度都是相同的(見圖1),這顯然是不符合自然規律的。

圖1 所有的樹都同樣大小
如果保持這樣的結果,將使三維模型和后期以三維模型為基礎生成的其他文件看起來很不自然。為了讓三維模型看起來更自然,就需要挨個調整每一棵樹的大小,由于園林中的樹通常很多(尤其是綠化占主要內容的項目),而且SketchUp本身自帶的縮放或旋轉工具效率不高,所以這就意味著較大的工作量和較低的工作效率。
為了使運用SketchUp制作的三維模型更加自然,提高勞動效率,降低勞動強度,本文開發了一款SketchUp插件,其可以一次性地按照用戶設定的縮放和旋轉邊界,以組件的原點為基準對所選組件實現批量隨機縮放,從而解決上述的問題,使模型看起來更自然。
插件運用Ruby語言開發,Ruby也是SketchUp命令的底層語言。
插件通過each方法遍歷用戶選擇的每一個組件,并使其以原點為原點進行縮放/旋轉:

為方便用戶的使用,插件在算法中過濾掉了用戶選擇的圖元中的其它元素,使得縮放/旋轉變換只對組件起作用:

為了在用戶填反最大值/最小值的情況下也能變換,插件采用自動將用戶實際填入的值中大的作為最大值,小的作為最小值的處理方案(但仍會提示用戶檢查是否有其他錯誤):

#不管用戶如何填寫,最大值總是取大的,最小值總是取小的。
經測試,插件適合以下操作系統版本和SketchUp版本的任意組合。
操作系統版本:Windows7、Windows10
SketchUp版本:SketchUp8、SketchUp2013-2021
在硬件方面,SketchUp8及以上版本的硬件都滿足插件的運行需求。
插件的名稱為“隨機縮放/旋轉”,通過Random_Scale_and_Rotation.rbz的rbz文件提供。
在SketchUp中,依次點擊菜單欄擴展程序管理器→安裝擴展程序→根據用戶的存儲位置找到程序→打開即可將插件安裝到SketchUp中(見圖2)。

圖2 插件的安裝方法
插件安裝后位于工具欄中,默認是隱藏的,使用時依次點擊視圖→工具欄→找到隨機縮放/旋轉并將前面復選框中的√勾選(或者在任意工具欄的空白處右擊,在彈出的菜單中找到隨機縮放/旋轉勾選)即可顯示插件。插件的圖標為兩棵樹。
當用戶的選擇集中不包含組件時,圖標是不可用狀態(grey),當用戶的選擇集中包含組件時,插件即自動激活(enable)。用戶點擊插件圖標,即可實現對所選組件的隨機縮放/旋轉。
用戶點擊圖標,即彈出輸入縮放/旋轉邊界輸入框,讓用戶輸入縮放/旋轉的邊界,縮放比例以百分比為單位,旋轉角度以角度為單位,默認縮放比例為80%~120%,旋轉角度為0°~360°(見圖3)。

圖3 用戶可在輸入框中輸入縮放/旋轉上下界
用戶輸入數值后點擊確定按鈕,即按照輸入的數值隨機縮放/旋轉用戶選擇的組件(見圖4)。

圖4 樹隨機批量縮放/旋轉效果
插件的第1個易用性在于插件在進行隨機縮放/旋轉的過程中過濾掉了用戶選擇集中的其他圖元,只對組件起作用,由于SketchUp的選擇工具本身比較難用,這樣就避免了用戶誤將其它圖元選擇入選擇集時產生誤操作的情況。如在圖中,若用戶的選擇集中還包含了后邊的建筑、花池、草地、路,它們分別是SketchUp中的組、面、線圖元——但都不是組件圖元,插件并不對它們起作用,而只對組件圖元樹進行如圖4所示的隨機旋轉或/和縮放。
需要注意的是,插件是忽略角度的周期性的,即插件認為10°跟370°是不同的角度,所以用戶的旋轉角度界限輸入為0°~10°和0°~370°時的效果是不同的,前者只能讓組件在0°~10°之間產生一個微小的隨機旋轉,后者則能產生超過一個圓周的隨機旋轉。
另外,根據SketchUp的算法,旋轉只對沒有勾選“總是朝向相機”選項的組件起作用,對于勾選了“總是朝向相機”的組件,不管怎么旋轉,總是紅原點藍這個平面面向用戶(見圖5)。這不是插件的缺陷,而是SketchUp默認的算法,這也是符合日常行為邏輯的,如一個圖片制成的面片樹組件,我們總是希望這個圖片面向著我們,這樣看起來才像棵樹,如果這個面轉了,它就是一條線了(轉90°的時候就只剩下一條線),這是我們所不希望的結果。

圖5 旋轉命令對勾選了“總是朝向相機”的組件不起作用
圖4中的樹就是一種總是朝向相機的組件,所以隨機旋轉在圖4中并不起作用,圖6中的樹并不總是朝向相機,所以隨機旋轉對圖6是起作用的。

圖6 旋轉命令對沒有勾選“總是朝向相機”的組件起作用
若用戶錯誤地將縮放/旋轉的最小值和最大值寫反了——即用戶將最大值(最小值)填寫成了最小值(最大值),插件會向用戶提示并根據用戶的選擇執行忽略或者修改錯誤,這是插件的第2個易用性。
當用戶將最大值和最小值填反時,插件會彈出消息框,提示用戶填反了,并詢問用戶是否忽略錯誤,將用戶填寫的實際數值中的最大值和最小值作為最大值和最小值進行隨機縮放/旋轉,若用戶選擇是,插件將忽略用戶的錯誤,自動按照用戶實際填寫數值中的最大值(最小值)作為縮放/旋轉邊界進行運算。若用戶選擇否,則返回輸入框界面,讓用戶修改數值后提交。
插件的退出:插件可以在輸入框界面點擊關閉或者取消退出。
插件可幫助實現園林三維模型的自然開發,但顯而易見,其是針對SketchUp組件圖元的一項操作,所以,它適合有組件此類變換需求的任何行業,如舞臺場景、游戲設計、工業設計、建筑設計等。另外,對于當前的計算機系統或者編程語言,是不能產生真正意義的隨機序列的,所以同樣,插件對樹的隨機調整并不是真正意義上的隨機——這并不是插件的缺陷,而是當前信息技術和計算機的發展水平。但顯然,即使如此,對于我們關注視覺效果的三維模型來說已經足夠了。