張韞錚 戚廣平
同濟大學建筑與城市規劃學院
面向對象思想是現代計算機程序設計語言的重要思想,認為萬事萬物皆對象,對象是屬性及其操作的封裝體。面向對象思想將具有特定屬性和方法的個體封裝成一個個“類”,在使用時,無需了解類中方法的具體計算過程,只需通過輸入端對屬性進行賦值并了解輸出端接口的使用即可。在建筑設計領域,建筑單體可看作由門、窗等類構成的整體,建筑群體可看作由若干建筑單體類構成的整體。基于上述組合關系,面向對象思想可用于建筑設計中,通過編寫與封裝“類”從而組合生成整體。
面向過程思想是程序設計的傳統思想,20世紀50年代中后期,由于編寫大型程序時變量名在程序的不同部分容易發生沖突,語言設計者開始嘗試將變量名封裝到特定的對象內部,避免其與程序外部的同名變量發生沖突,面向對象(Object Oriented,又簡稱為OO)思想開始萌芽。20世紀90年代,面向對象思想不再局限于傳統的程序設計領域,逐漸被應用于多方面,促進了學科間的融合。
一切事物都可看作由若干“類”組成的整體,使得以對象及類為中心的思想具有普適性。同時,面向對象思想具有以下優越性:首先,一個類如同一個“黑箱”,具有特定屬性與方法的個體被封裝其中,調用時只需為類的屬性賦值使其成為實例化的具體對象,而無需了解其內部的具體方法;其次,被封裝的類可以被應用于多個不同的項目中,在編寫多個項目代碼時不需要重復編寫這些類的代碼,提高了類的可重用性。面向對象思想的相應代碼具有易于修改和維護的特點,若需要為類添加新的方法或屬性,只需修改其內部代碼,而其外部表現形式不變,呈現給使用者的是經過修改的原有類,使用者可以方便地找到并調用它。
面向過程注重其內部方法而不注重對象本身,面向對象注重對象本身而不注重其內部方法。下面以圖1中簡易的建筑為例,并運用Rhino建模軟件中的Grasshopper插件進行具體實現,從而討論建筑設計中的面向過程與面向對象思想。
面向過程是一種以過程為中心的編程思想,過程論認為世界是由各個過程不斷推進而形成的總體,過程中的每個步驟之間有嚴格的因果關系,需要明確解決問題過程中的各個步驟并將其依次實現。Rhino建模軟件中的Grasshopper插件定義了多個電池模塊,每個電池代表一步操作,可以通過連接不同的電池,完成建筑的建模與生成。若想生成一個如圖1所示的建筑,需要實現繪制建筑體量地面、生成體量、繪制窗線、擠出窗框等一系列操作,連接出的Grasshopper電池圖如圖2所示。這種方式需要建筑師具備較強的建模邏輯,完成繪制矩形、擠出平面等每一步細節操作,且建模面板較為復雜,具有較大的優化空間。
面向對象注重對象主體本身,對象是程序中的基本模塊。對象論認為世界由對象組成,在初始力的作用下,對象的交互促進了世界的形成。整體由不同個體組成,個體的行為被弱化。在確定對象時,要求各對象間的耦合度盡可能低,這有助于系統中某一部分變化不致于影響與其無關的對象的變化。例如,建筑整體包括體量、門、窗三個基本類,它們之間相互關聯程度低,基本能夠獨立變化,可以利用Grasshopper中的Python語言將這些類分別封裝成電池,只留下類的基本屬性作為輸入端,通過具體的賦值使類被實例化為具有特定尺寸的對象。
這種方法簡化了建模面板,僅用三個代表不同構件類的Grasshopper電池就完成了建模過程,把繁雜的生成程序分別隱藏于相應電池中(圖3),使建筑生成更加簡潔明晰,并且使用者可以通過調節建筑體量長度、寬度等輸入參數來改變建筑外觀,整個過程方便而高效。
在建筑設計領域,有學者開始利用Python語言探索以面向對象的方式生成建筑立面的不規則開窗以及單體音樂廳模型,但該研究僅針對簡易建筑單體。也有學者通過類型學面向對象的方法,利用Java語言建立風格化的門、窗等構件庫,并將其存儲于SketchUp中,但SketchUp對于參數的調節不如Grasshopper清晰直觀。目前建筑設計與生成中面向對象的探索較缺乏,因此本研究希望通過Grasshopper中的Python語言(下文簡稱GhPython)對建筑單體與群體進行基于面向對象思想的計算生成。

1 Grasshopper 生成的簡易建筑

2 生成建筑的面向過程程序
華南地區的騎樓街是由不同南洋風格的建筑構成的街道,便于以“類”進行區分與辨析,當代也有許多以南洋風格為母題的街道設計與建設,若利用面向對象思想生成若干風格化建筑單體,便能夠在類似風格的項目設計中進行類的復用。因此在進一步的面向對象設計生成研究中,選取了具有南洋風格的碉樓與騎樓作為建筑設計原型,進行對象的分類與程序設計。
首先選取四種不同的碉樓與騎樓原型,對其予以適當簡化,忽略細部裝飾紋樣,從而降低模型復雜度,便于計算機運行。以碉樓塔為例,編寫建筑生成的代碼。UML語言是程序編寫前用于需求分析與對象分類的統一建模語言,有助于程序編寫者明晰問題中各個“類”的組成關系。不同編寫者分析同一問題時可能得出不同的分類結果,在進行編程前首先要運用UML語言進行面向對象的分析,明確組成建筑的各個對象以及各對象包含的屬性。在此例中,塔可看作由主體建筑體量、門、窗、塔頂四個類組成的,每個類包含不同的屬性,如主體建筑體量的屬性有長度、寬度、高度等,得出圖5所示的架構圖。
根據UML類圖的架構,在GhPython中分別對主體建筑的體量、窗、門、塔頂進行代碼編寫,通過封裝屏蔽了繁雜的代碼細節(圖6)。
各構件類的外觀及構件數量隨輸入端數字的改變而變化,且各構件類相對獨立,對象之間無相互影響。圖7展示了不同的輸入端賦值導致的建筑單體外觀變化,通過改變輸入端參數可以改變構件的長、寬等尺寸。從圖中可以看出,生成特定構件的畫線、擠出等操作被編碼于構件類內部,使用時只需拖動滑塊調節參數而無需了解其內部的具體計算過程,方便設計與生成。
類似地,對其他三種形式的騎樓進行構件對象確定與代碼編寫。雖然各建筑原型都具有長、寬、高等參數,但由于它們被定義在不同的類中,彼此之間不會產生沖突,最終生成建筑形體以及相應Grasshopper電池圖(圖8)。

3 建筑的生成程序

4 赤坎古鎮建筑與街道

5 塔的UML 架構圖

6 塔及相應Grasshopper 電池圖

7 輸入端變化及塔對應外觀變化
需要注意的是,組成建筑單體的各個類劃分方式并不唯一,單體既可以看作是由門、窗、建筑體量等基本類組成,又可看作為兩級包含的結構,即單體包含一層、二層、三層等,每層又包含門、窗等基本構件。在確定對象時,需要根據具體需求采用不同的分類方式。
街道由若干不同形式的建筑連接組成,這些組成街道的建筑單體就是街道的對象。我們可以確定若干種建筑形式,通過Random函數使不同的建筑形式隨機組合,生成多種街道建筑組合方案,供建筑師加以選擇。在本樣例中,組成街道的建筑形式包括塔、騎樓形式1、騎樓形式2、騎樓形式3,繪制出UML類圖以確定項目架構(圖9)。
該部分生成程序希望完成以下任務:繪制一條街道線,不同形式的建筑自動沿街道線排布并隨機組合,每次運行得到不同的排布結果。將實現上述步驟的代碼封裝到“街道”類中,對象的輸入端包含不同建筑形式,即塔、騎樓形式1、騎樓形式2、騎樓形式3及街道線五個參數。在本例中,塔、騎樓形式1、騎樓形式2、騎樓形式3在街道中出現的概率分別是1/7、2/7、2/7、2/7,每計算一次便生成一種新的組合方案(圖10)。
街道包含塔等四種建筑單體類,各種建筑單體又包含門、窗、建筑體量等基本構件類。根據這兩級包含關系,可以生成多樣化的街道空間與建筑對象,為設計提供多種可能性。
本研究結合傳統建筑原型與計算性設計方法,探討了基于面向對象思想的風格化建筑及街道空間生成方法,提出了一種具有可行性的建筑設計工作流。通過本研究,可得出如下結論。
第一,面向對象思想以對象與類為中心,對生成特定類的代碼進行封裝的方法能有效隱藏對使用者而言不重要的內容,只需調節輸入端參數生成輸出端的對象實例即可。在運用GhPython生成建筑時,不要求每位使用者都會編寫程序,使用者只需了解調節參數滑塊導致的“類”的外觀變化。同時,若類內部生成邏輯需要調整,可以直接對內部代碼進行改寫,修改后呈現的輸入輸出端基本保持不變,便于使用。
第二,對象的分類與程序編寫與建筑學中的類型學方法有異曲同工之妙,類的可重復利用性為建筑構件數據庫的編寫與創建提供了有利依據。例如,中國古建筑屋頂可分為歇山頂、硬山頂、廡殿頂等若干類,可編寫相應屋頂類的生成程序,保存于建筑構件數據庫中,需要使用時調用特定類,并通過調節參數確定需要的構件外觀尺寸及數量。這種分類方法在相似風格的建筑生成中具有較高的可復用性,在建筑設計領域有較廣闊的應用前景。
本研究的街道建筑生成程序尚有許多可優化之處,生成各個類的代碼可以進行簡化,從而提高運行效率。在進一步的研究當中可以考慮加強事件響應機制,使組成建筑的各個對象之間具有聯動性,并且各對象的可變參數可根據建筑組織模式的不同重新定義。同時也可考慮加入光、熱、風等環境影響參數,使環境性能影響建筑生成。目前,面向對象的建筑生成方法對標準化的建筑生成較有效且具有較高的可復用性,而異形建筑由于生成邏輯不同,無法歸納出統一的代碼邏輯與包含對象。因此,面向對象思想對于異形建筑的適應性尚有待探討。

8 三種騎樓形式及相應Grasshopper 電池圖

9 街道的UML 架構圖

10 街道建筑的不同組合方案
圖片來源
圖4 來源于網絡;其余圖片均由作者自繪。