張韞錚 戚廣平
同濟(jì)大學(xué)建筑與城市規(guī)劃學(xué)院
面向?qū)ο笏枷胧乾F(xiàn)代計算機(jī)程序設(shè)計語言的重要思想,認(rèn)為萬事萬物皆對象,對象是屬性及其操作的封裝體。面向?qū)ο笏枷雽⒕哂刑囟▽傩院头椒ǖ膫€體封裝成一個個“類”,在使用時,無需了解類中方法的具體計算過程,只需通過輸入端對屬性進(jìn)行賦值并了解輸出端接口的使用即可。在建筑設(shè)計領(lǐng)域,建筑單體可看作由門、窗等類構(gòu)成的整體,建筑群體可看作由若干建筑單體類構(gòu)成的整體。基于上述組合關(guān)系,面向?qū)ο笏枷肟捎糜诮ㄖO(shè)計中,通過編寫與封裝“類”從而組合生成整體。
面向過程思想是程序設(shè)計的傳統(tǒng)思想,20世紀(jì)50年代中后期,由于編寫大型程序時變量名在程序的不同部分容易發(fā)生沖突,語言設(shè)計者開始嘗試將變量名封裝到特定的對象內(nèi)部,避免其與程序外部的同名變量發(fā)生沖突,面向?qū)ο螅∣bject Oriented,又簡稱為OO)思想開始萌芽。20世紀(jì)90年代,面向?qū)ο笏枷氩辉倬窒抻趥鹘y(tǒng)的程序設(shè)計領(lǐng)域,逐漸被應(yīng)用于多方面,促進(jìn)了學(xué)科間的融合。
一切事物都可看作由若干“類”組成的整體,使得以對象及類為中心的思想具有普適性。同時,面向?qū)ο笏枷刖哂幸韵聝?yōu)越性:首先,一個類如同一個“黑箱”,具有特定屬性與方法的個體被封裝其中,調(diào)用時只需為類的屬性賦值使其成為實例化的具體對象,而無需了解其內(nèi)部的具體方法;其次,被封裝的類可以被應(yīng)用于多個不同的項目中,在編寫多個項目代碼時不需要重復(fù)編寫這些類的代碼,提高了類的可重用性。面向?qū)ο笏枷氲南鄳?yīng)代碼具有易于修改和維護(hù)的特點,若需要為類添加新的方法或?qū)傩?,只需修改其?nèi)部代碼,而其外部表現(xiàn)形式不變,呈現(xiàn)給使用者的是經(jīng)過修改的原有類,使用者可以方便地找到并調(diào)用它。
面向過程注重其內(nèi)部方法而不注重對象本身,面向?qū)ο笞⒅貙ο蟊旧矶蛔⒅仄鋬?nèi)部方法。下面以圖1中簡易的建筑為例,并運用Rhino建模軟件中的Grasshopper插件進(jìn)行具體實現(xiàn),從而討論建筑設(shè)計中的面向過程與面向?qū)ο笏枷搿?/p>
面向過程是一種以過程為中心的編程思想,過程論認(rèn)為世界是由各個過程不斷推進(jìn)而形成的總體,過程中的每個步驟之間有嚴(yán)格的因果關(guān)系,需要明確解決問題過程中的各個步驟并將其依次實現(xiàn)。Rhino建模軟件中的Grasshopper插件定義了多個電池模塊,每個電池代表一步操作,可以通過連接不同的電池,完成建筑的建模與生成。若想生成一個如圖1所示的建筑,需要實現(xiàn)繪制建筑體量地面、生成體量、繪制窗線、擠出窗框等一系列操作,連接出的Grasshopper電池圖如圖2所示。這種方式需要建筑師具備較強的建模邏輯,完成繪制矩形、擠出平面等每一步細(xì)節(jié)操作,且建模面板較為復(fù)雜,具有較大的優(yōu)化空間。
面向?qū)ο笞⒅貙ο笾黧w本身,對象是程序中的基本模塊。對象論認(rèn)為世界由對象組成,在初始力的作用下,對象的交互促進(jìn)了世界的形成。整體由不同個體組成,個體的行為被弱化。在確定對象時,要求各對象間的耦合度盡可能低,這有助于系統(tǒng)中某一部分變化不致于影響與其無關(guān)的對象的變化。例如,建筑整體包括體量、門、窗三個基本類,它們之間相互關(guān)聯(lián)程度低,基本能夠獨立變化,可以利用Grasshopper中的Python語言將這些類分別封裝成電池,只留下類的基本屬性作為輸入端,通過具體的賦值使類被實例化為具有特定尺寸的對象。
這種方法簡化了建模面板,僅用三個代表不同構(gòu)件類的Grasshopper電池就完成了建模過程,把繁雜的生成程序分別隱藏于相應(yīng)電池中(圖3),使建筑生成更加簡潔明晰,并且使用者可以通過調(diào)節(jié)建筑體量長度、寬度等輸入?yún)?shù)來改變建筑外觀,整個過程方便而高效。
在建筑設(shè)計領(lǐng)域,有學(xué)者開始利用Python語言探索以面向?qū)ο蟮姆绞缴山ㄖ⒚娴牟灰?guī)則開窗以及單體音樂廳模型,但該研究僅針對簡易建筑單體。也有學(xué)者通過類型學(xué)面向?qū)ο蟮姆椒ǎ肑ava語言建立風(fēng)格化的門、窗等構(gòu)件庫,并將其存儲于SketchUp中,但SketchUp對于參數(shù)的調(diào)節(jié)不如Grasshopper清晰直觀。目前建筑設(shè)計與生成中面向?qū)ο蟮奶剿鬏^缺乏,因此本研究希望通過Grasshopper中的Python語言(下文簡稱GhPython)對建筑單體與群體進(jìn)行基于面向?qū)ο笏枷氲挠嬎闵伞?/p>
1 Grasshopper 生成的簡易建筑
2 生成建筑的面向過程程序
華南地區(qū)的騎樓街是由不同南洋風(fēng)格的建筑構(gòu)成的街道,便于以“類”進(jìn)行區(qū)分與辨析,當(dāng)代也有許多以南洋風(fēng)格為母題的街道設(shè)計與建設(shè),若利用面向?qū)ο笏枷肷扇舾娠L(fēng)格化建筑單體,便能夠在類似風(fēng)格的項目設(shè)計中進(jìn)行類的復(fù)用。因此在進(jìn)一步的面向?qū)ο笤O(shè)計生成研究中,選取了具有南洋風(fēng)格的碉樓與騎樓作為建筑設(shè)計原型,進(jìn)行對象的分類與程序設(shè)計。
首先選取四種不同的碉樓與騎樓原型,對其予以適當(dāng)簡化,忽略細(xì)部裝飾紋樣,從而降低模型復(fù)雜度,便于計算機(jī)運行。以碉樓塔為例,編寫建筑生成的代碼。UML語言是程序編寫前用于需求分析與對象分類的統(tǒng)一建模語言,有助于程序編寫者明晰問題中各個“類”的組成關(guān)系。不同編寫者分析同一問題時可能得出不同的分類結(jié)果,在進(jìn)行編程前首先要運用UML語言進(jìn)行面向?qū)ο蟮姆治?,明確組成建筑的各個對象以及各對象包含的屬性。在此例中,塔可看作由主體建筑體量、門、窗、塔頂四個類組成的,每個類包含不同的屬性,如主體建筑體量的屬性有長度、寬度、高度等,得出圖5所示的架構(gòu)圖。
根據(jù)UML類圖的架構(gòu),在GhPython中分別對主體建筑的體量、窗、門、塔頂進(jìn)行代碼編寫,通過封裝屏蔽了繁雜的代碼細(xì)節(jié)(圖6)。
各構(gòu)件類的外觀及構(gòu)件數(shù)量隨輸入端數(shù)字的改變而變化,且各構(gòu)件類相對獨立,對象之間無相互影響。圖7展示了不同的輸入端賦值導(dǎo)致的建筑單體外觀變化,通過改變輸入端參數(shù)可以改變構(gòu)件的長、寬等尺寸。從圖中可以看出,生成特定構(gòu)件的畫線、擠出等操作被編碼于構(gòu)件類內(nèi)部,使用時只需拖動滑塊調(diào)節(jié)參數(shù)而無需了解其內(nèi)部的具體計算過程,方便設(shè)計與生成。
類似地,對其他三種形式的騎樓進(jìn)行構(gòu)件對象確定與代碼編寫。雖然各建筑原型都具有長、寬、高等參數(shù),但由于它們被定義在不同的類中,彼此之間不會產(chǎn)生沖突,最終生成建筑形體以及相應(yīng)Grasshopper電池圖(圖8)。
3 建筑的生成程序
4 赤坎古鎮(zhèn)建筑與街道
5 塔的UML 架構(gòu)圖
6 塔及相應(yīng)Grasshopper 電池圖
7 輸入端變化及塔對應(yīng)外觀變化
需要注意的是,組成建筑單體的各個類劃分方式并不唯一,單體既可以看作是由門、窗、建筑體量等基本類組成,又可看作為兩級包含的結(jié)構(gòu),即單體包含一層、二層、三層等,每層又包含門、窗等基本構(gòu)件。在確定對象時,需要根據(jù)具體需求采用不同的分類方式。
街道由若干不同形式的建筑連接組成,這些組成街道的建筑單體就是街道的對象。我們可以確定若干種建筑形式,通過Random函數(shù)使不同的建筑形式隨機(jī)組合,生成多種街道建筑組合方案,供建筑師加以選擇。在本樣例中,組成街道的建筑形式包括塔、騎樓形式1、騎樓形式2、騎樓形式3,繪制出UML類圖以確定項目架構(gòu)(圖9)。
該部分生成程序希望完成以下任務(wù):繪制一條街道線,不同形式的建筑自動沿街道線排布并隨機(jī)組合,每次運行得到不同的排布結(jié)果。將實現(xiàn)上述步驟的代碼封裝到“街道”類中,對象的輸入端包含不同建筑形式,即塔、騎樓形式1、騎樓形式2、騎樓形式3及街道線五個參數(shù)。在本例中,塔、騎樓形式1、騎樓形式2、騎樓形式3在街道中出現(xiàn)的概率分別是1/7、2/7、2/7、2/7,每計算一次便生成一種新的組合方案(圖10)。
街道包含塔等四種建筑單體類,各種建筑單體又包含門、窗、建筑體量等基本構(gòu)件類。根據(jù)這兩級包含關(guān)系,可以生成多樣化的街道空間與建筑對象,為設(shè)計提供多種可能性。
本研究結(jié)合傳統(tǒng)建筑原型與計算性設(shè)計方法,探討了基于面向?qū)ο笏枷氲娘L(fēng)格化建筑及街道空間生成方法,提出了一種具有可行性的建筑設(shè)計工作流。通過本研究,可得出如下結(jié)論。
第一,面向?qū)ο笏枷胍詫ο笈c類為中心,對生成特定類的代碼進(jìn)行封裝的方法能有效隱藏對使用者而言不重要的內(nèi)容,只需調(diào)節(jié)輸入端參數(shù)生成輸出端的對象實例即可。在運用GhPython生成建筑時,不要求每位使用者都會編寫程序,使用者只需了解調(diào)節(jié)參數(shù)滑塊導(dǎo)致的“類”的外觀變化。同時,若類內(nèi)部生成邏輯需要調(diào)整,可以直接對內(nèi)部代碼進(jìn)行改寫,修改后呈現(xiàn)的輸入輸出端基本保持不變,便于使用。
第二,對象的分類與程序編寫與建筑學(xué)中的類型學(xué)方法有異曲同工之妙,類的可重復(fù)利用性為建筑構(gòu)件數(shù)據(jù)庫的編寫與創(chuàng)建提供了有利依據(jù)。例如,中國古建筑屋頂可分為歇山頂、硬山頂、廡殿頂?shù)热舾深?,可編寫相?yīng)屋頂類的生成程序,保存于建筑構(gòu)件數(shù)據(jù)庫中,需要使用時調(diào)用特定類,并通過調(diào)節(jié)參數(shù)確定需要的構(gòu)件外觀尺寸及數(shù)量。這種分類方法在相似風(fēng)格的建筑生成中具有較高的可復(fù)用性,在建筑設(shè)計領(lǐng)域有較廣闊的應(yīng)用前景。
本研究的街道建筑生成程序尚有許多可優(yōu)化之處,生成各個類的代碼可以進(jìn)行簡化,從而提高運行效率。在進(jìn)一步的研究當(dāng)中可以考慮加強事件響應(yīng)機(jī)制,使組成建筑的各個對象之間具有聯(lián)動性,并且各對象的可變參數(shù)可根據(jù)建筑組織模式的不同重新定義。同時也可考慮加入光、熱、風(fēng)等環(huán)境影響參數(shù),使環(huán)境性能影響建筑生成。目前,面向?qū)ο蟮慕ㄖ煞椒▽?biāo)準(zhǔn)化的建筑生成較有效且具有較高的可復(fù)用性,而異形建筑由于生成邏輯不同,無法歸納出統(tǒng)一的代碼邏輯與包含對象。因此,面向?qū)ο笏枷雽τ诋愋谓ㄖ倪m應(yīng)性尚有待探討。
8 三種騎樓形式及相應(yīng)Grasshopper 電池圖
9 街道的UML 架構(gòu)圖
10 街道建筑的不同組合方案
圖片來源
圖4 來源于網(wǎng)絡(luò);其余圖片均由作者自繪。