Dynamo應用秘籍:8:Revit地形到Dynamo的Solid

從Revit的地形是無法直接到一個Dynamo的Solid實體的,實際上,需要創建Solid實體,還需要在地形的基礎上增加一些輸入選項方可做成一般可以使用的Solid。一般情況下,我們會需要這個Solid的上表面是地形Surface,下表面是個比地形低的平面。在上篇秘籍中,我們可以將Revit地形轉換成Dynamo的Surface,現在我們就在這個Surface的基礎上討論如何構建成Solid。

Dynamo裡面有個Surface.Thicken的節點,不過這個節點只能處理比較簡單的Surface,對於由地形轉換成的PolySurface,這個節點經常會報錯。

看一下錯誤提示,是邊線及頂點無法形成閉環。這個原因主要是因為地形的PolySurface是有非常多的小三角形的Surface構成的,其中需要處理的數據量就可想而知。這個節點在處理這種規模的數據上略顯吃力,經常無法完成。我們知道,在Dynamo中可以提取PolySurface中的每一個Surface出來,因此可以只對提取出來的簡單的Surface進行Thicken,這樣節點就不會報錯。實際驗證是怎麼樣呢?結果如下圖:

因為Thicken的時候是根據Surface所在平面的法向(Normal)方向進行的,而對地形表面分解後的一個個三角形Surface來說,他們的Normal都不是統一的,所以最後節點運行沒有錯誤,但卻會生成比較怪異的結果。雖然可能看起來樣子很酷,但並不是我們需要的,這樣的Solid跟原來的地形也是完全不同的圖形。

那麼我們需要如何來做呢?需要強制指定投影的方向為垂直的Z軸。這種時候,就需要由Surface導出邊界PolyCurve,再垂直投影這個PolyCurve到平面,然後使用兩個PolyCurve作為輪廓來執行Loft創建Solid。如此,我們就可以得到一個由很多小三稜柱形狀的Solid所組成的列表,如下圖所示:

這樣處理後的數據量還是有些龐大的,好在在獲取了這些Solid列表後,可以使用Solid.ByUnion節點將他們合併成一個單個的Solid。

很明顯,這種方式需要處理的Surface實體數量很大,對Dynamo而言,運行效率是個很大的挑戰,數據量比較大時,Dynamo的運行效率也可想而知。因此方法可行,但是實用性較差。因此需要找到更精簡一些的圖形學演算法。

在Dynamo中構建Solid,有一種方式是根據外殼的Surface來構建,畢竟對於地形來說,除了邊界的位置,中間位置的數據在形成小Solid後的合併中都會被合併掉,其實沒有什麼作用。從這個思路出發,可以使用如下的方法構建未來Solid的外殼Surface,再由Surface組合形成Solid:

  1. 將地形表面PolySurface的外輪廓PolyCurve投影到底面,形成一個封閉的PolyCurve

  2. Patch這個底面PolyCurve成底面Surface

  3. Loft地形輪廓PolyCurve及底面PolyCurve成側面的PolySurface

通過這樣三步,我們就獲取了未來Solid的頂面、底面和側面,再直接使用Solid.ByJoinedSurface來快速構建Solid。具體操作如下:

使用外殼Surface轉換的方法,Dynamo生成Solid的速度比使用小Solid合併的方法要快10倍以上。有興趣的可以根據截圖構建Dynamo程序測試。

--------------------------我是分隔線--------------------------

在Dynamo裡面有Curve.ByPatch節點通過閉合曲線來形成Surface,在曲線為平面曲線時,會生成一個平面的Surface,當曲線為空間曲線時,這個Surface也能夠生成,但是因為曲線是空間,生成的空間三維Surface在中間部分的位置就是由邊界直接光滑過度產生出來。利用這個原理,如果地形本身的高低起伏相差不大,可以直接獲取轉換後的Surface,提取其邊界曲線連接成PolyCurve再直接ByPatch她,這樣可以獲得一個非常精簡數據的光滑表面。

兩個Surface之間的差異需要實際對比觀察,下圖僅僅是一種情況下的實例:

可以對新生成的Surface與原始地形進行差異比較來判斷是否使用這個光滑的單一Surface來替代原來的地形轉換生成的PolySurface。

連載鏈接:上一篇 << ooo >> 下一篇


推薦閱讀:

Dynamo應用秘籍:10:使用周期性運行製作動畫演示
什麼軟體可以給實體模型分層用作激光切割?
python unittest如何進行參數化?

TAG:Dynamo | AutoDeskRevit | 参数化设计 |