张韫铮 戚广平
同济大学建筑与城市规划学院
面向对象思想是现代计算机程序设计语言的重要思想,认为万事万物皆对象,对象是属性及其操作的封装体。面向对象思想将具有特定属性和方法的个体封装成一个个“类”,在使用时,无需了解类中方法的具体计算过程,只需通过输入端对属性进行赋值并了解输出端接口的使用即可。在建筑设计领域,建筑单体可看作由门、窗等类构成的整体,建筑群体可看作由若干建筑单体类构成的整体。基于上述组合关系,面向对象思想可用于建筑设计中,通过编写与封装“类”从而组合生成整体。
面向过程思想是程序设计的传统思想,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 来源于网络;其余图片均由作者自绘。