基于SketchUp 动态组件的建筑参数化设计方法研究

2024-03-04 10:33彭鹏王凯飞赵佳杰张月辰
重庆建筑 2024年2期
关键词:表达式组件动态

彭鹏,王凯飞,2,赵佳杰,张月辰

(1 石家庄铁道大学 建筑与艺术学院,河北石家庄 050043;2 北方工程设计研究院有限公司,河北石家庄 050011)

0 引言

随着计算机技术的迅猛发展,建筑设计行业也已完全由计算机作图替代了手工制图,高效的制图方式除了给设计表现带来方便和快捷之外,还使得方案的精细推敲成为了可能[1]。

在当今建筑设计行业中,大多数计算机作图依然停留在“先想后得”的制图模式,即建筑师先在大脑中构建出所期望的结果,再利用计算机将其简单地表现出来,其中设计和建模表现是两个独立的过程。但是在实际工程应用中,设计方案很少能够一次性通过,设计方案的调整和变更需要耗费设计师大量的精力将新的方案再次建模。同时,由于表现相对于设计的滞后性,设计师从表现的结果直观反馈到设计环节的推敲也会出现低效的现象。由于设计和表现是分离状态,所以每一次对方案的调整都需要经历一个完整的过程,在计算机建模环节会出现较大的人工内耗,大量重复性的工作降低了效率,同时还减小了方案推敲的精细程度[2]。

建筑参数化设计在此体现了巨大的优势,参数化设计模糊了建筑设计和模型表现之间的界限,通过控制参数变量使模型按照某种编译好的规则进行变化,缩短了从方案调整到呈现结果之间的过程,甚至可做到实时修改,真正实现“所见所得”。由于省去了再次建模的重复工作,方案推敲的过程也将会更加灵活和自由[3]。

1 SketchUp 软件在建筑设计领域的优势

SketchUp 软件在建筑设计领域的应用比其他3D 设计软件更为广泛[4]。它的建模逻辑清晰且简单,主要通过绘制直线和推拉成体的方式快速生成模型,步骤精简,能够快速表现效果,非常有利于建筑方案设计的前期推敲。同时,它内置较多适合建筑设计的功能,例如精确时间和地理坐标的太阳阴影渲染、方便快捷的材质系统、人视位置定位相机以及漫游、快速剖切模型等。由于其相对精度较低,所以它对计算机硬件要求也较低,非常适合常用的直线较多的线性建模场景。

SketchUp 拥有非常丰富的扩展功能[5],通过开放的Ruby 语言可以为软件开发丰富的插件,实现更多的高级功能[6]。SketchUp 通过SUAPP、坯子助手、1001bit Tools 等建模辅助插件可以使建模更加方便快捷,有效提高建模效率,通过Viz、Profile Builder 等参数化插件可以实现更高级的非线性建模和参数化管理,通过V-Ray、Enscape 等渲染器插件可以快速对接后期效果图的渲染表现。此外SketchUp 还拥有丰富的官方及第三方模型素材库,可以在实际工作应用中快速得到预期的表现效果[7]。

因此在我们研究参数化建模设计时,除了关注主流的Grasshopper、Dynamo 等老牌参数化软件以外,SketchUp 的参数化应用同样值得被重视,尤其是容易被人们遗忘的SketchUp 内置动态组件功能,更加值得我们去认识和研究[8]。

2 参数化建模设计基本方法

2.1 参数化建模的定义和特征

参数化建模设计并非特指我们常见的复杂曲面的构建,对于一切将3D 模型的参数数据化,并通过一定的计算机算法控制其参数的建模设计都应统称为参数化建模设计[9]。它有两个重要特征,一是能够提取3D 模型的参数和数据,二是能够通过计算机程序算法来控制其参数。

参数化工具更像一种计算机编程语言。任何3D 建模过程的本质都是将设计者的某种预期反映至计算机3D 模型上的过程,是一种人与计算机的交流。在脱离参数化的直接建模中,人与3D 模型的交流媒介就是建模软件中的常规编辑工具,它是一种抽象的语言,有如手语和行为语言,传递信息的过程是受限且低效的。参数化工具则更像一种高级语言,它重新建立了一套新的建模逻辑,利用更加自由的计算机语言来描述建模行为与过程,在某些场景下能够产生更高的效率与发挥更大的优势。

3D 模型转译为计算机可以处理的有效数据,则需将描述模型的参数和数据提取出来。因此,模型中的各项元素都应有一个对应的专属信息标签,通过这个信息标签可以得到该元素的各项控制属性,例如坐标、长度、材质等。属性描述了模型中元素的状态,也控制了元素的唯一性,我们既可以通过读取属性来获取该元素的信息,也可以通过更改属性来控制元素的形态及其模型效果,如图1 所示。

图1 模型与参数化工具之间交流的桥梁

在计算机程序设计中需要通过表达式来实现多种功能,其中较有代表性的为逻辑表达式和函数表达式。逻辑表达式是处理数据并集、交集的一种有效手段,它包含“与(And)”“或(Or)”“非(Not)”三种状态[10]。函数表达式如同数学中的函数概念,通过输入自变量x 可以得到唯一的因变量f(x)反馈值,计算机程序中的函数表达式是一个可以实现某种预定功能的代码黑匣子,当为其输入一个或多个自变量,便可返回一个经过代码运算的因变量反馈,如图2 所示。函数可自定义,也可通过调用运行库获得丰富的内置函数。在我们后续的参数化建模当中,表达式的运用非常关键[11]。

图2 函数表达式示意

2.2 参数化建模常见的两种控制模式

参数化建模设计的控制模式一般可分为类Grasshopper 系的通过数据流控制和SketchUp 动态组件的通过对象属性控制两种方式。

Grasshopper 或Dynamo 中的电池组相当于高度集成的函数表达式[12-13],数据在函数表达式之间的传递通过电池间的连线实现。它简化了程序设计当中的许多特征,所有的功能都通过独立的电池组即函数表达式来实现。例如,并不强调程序入口和出口的概念,它可从任意一个数据源开始,到任意一个函数表达式结束。它更关注的是数据的输入和结果的呈现,任何一个数据源都是数据的输入,数据源可以是一个参数化编程中指定的一个常数,也可以是模型中的某个参数;数据流中任意一个有控制模型功能的函数表达式都可作为结果,而这种带有控制模型功能的函数表达式可能并非数据流的末端,它依然可将处理过的数据继续传递给下一个函数表达式,如图3 所示。

图3 通过数据流控制方式

SketchUp 允许开发者给组件配置属性(Attributes),而每一个配置了属性的组件都可看作一个单独的对象。组件的属性反映了组件的几何特征,为属性赋予的值也会反过来控制组件的几何形态,两者是相互制约的关系,通过给组件的属性赋予复杂的函数表达式便可实现对组件几何形态的自由控制,如图4 所示。通过对象属性控制并没有像Grasshopper 那样直观的数据流界面,它通过类似Excel 表的形式展现,表达式则直接以公式的形式出现在属性表中,其操作的易用性也因此大打折扣,对开发者逻辑的清晰度也有更高的要求。

图4 通过对象属性控制方式

3 SketchUp 动态组件的功能及实际应用

3.1 功能简介

组件(Components)是SketchUp 软件的特有功能,它可以将指定的线、面合并成组,并且在重复使用时依然可以让全部相同组件保持一致,类似于AutoCAD 中“块”的概念。动态组件(Dynamic Components)是SketchUp 软件附带的参数化设计工具,它可以给组件添加更强大的功能,通过类似Excel 表的属性窗口,便可自由地控制组件的几何形态[8]。它主要通过“组件属性(Component Attributes)”面板实现,如图5 所示。

图5 示例组件“Bookshelf”的组件属性面板

属性是“组件属性”面板的主体部分,每一行对应了一项组件的属性。软件将属性分为了多项子类,按照使用功能可以归纳为界面、几何形态、行为、变量四大类。其中界面类的属性主要控制“组件选项”面板中的内容,是开发者给普通用户展现的部分;几何形态类主要控制该组件的3D 模型形态,包含XYZ 坐标位置信息、长宽高数值信息、旋转角度信息等;行为类可以对模型进行一些常规的操作,例如复制、隐藏、限定缩放控制点等;变量类则是工具给开发者预留的可以自定义设置变量的属性空间[8]。

函数存在于属性的值当中,以公式的形式存在。函数是使参数化设计工具能够实现无限种类功能的关键所在。它涵盖运算符、数学函数、逻辑函数、onClick 函数、SketchUp 函数、三角函数、文字函数七大类,其中以前三者使用频率最高。通过复杂的函数搭配能够使组件属性获得丰富多样的逻辑变化,进而实现多种参数化功能。

3.2 设计过程

整个参数化设计的工作流程可以归纳为构思-设计-测试三部分[9]。

在构思阶段需要重点考虑对动态组件所期望的功能和该功能的实现方法。在参数化设计过程中,我们的身份应当是开发者而非3D 建模的普通用户,所以功能的重要性要大于建模,而实现方法的构思则需要开发者对动态组件知识有足够的经验积累,需要开发者清楚每一个属性和函数表达式所能够实现的功能,从而判断每一种不同的功能能否搭配实现最终的目标功能。

设计阶段则只需要熟练掌握动态组件的语法规则、属性,以及函数的灵活运用,便可以轻松完成开发。动态组件也以利用像Grasshopper 那样的数据流思维来推动属性的编写。数据流起始端是输入的数据,它可以通过直接在属性中自定义输入数值实现,也可以通过模型中的组件属性调取。通过各种函数表达式将数据进行适当的处理,并最终将其输出于组件的某个属性中。可以说,数据起始于属性,中转于属性,输出于属性。

动态组件的语法规则很简单,每一个属性都可以当做普通变量来使用,也就可以当做函数的因变量直接嵌套。当属性需要赋值时,则需要在表达式最前面加一个“=”符号,这里的等号不代表等于的含义,而是表示将等号右边的值赋给左边的属性。

测试阶段的目的是以普通用户的角度试用检查,来反推设计中是否出现了错误,测试的过程应当尽可能将所有可能出现的结果进行穷举,若出现问题则需返回设计阶段进行修改和调试,最终得到期望的结果。通过了测试阶段,参数化设计的过程才能算完整。

3.3 应用实例分析

本节通过两个不同类型的案例探讨动态组件在实际使用当中的设计思路及应用。

3.3.1 参数化建筑表皮应用

利用参数化工具可对建筑外立面表皮进行丰富的设计,本案例通过制作一个圆柱形建筑格栅表皮来说明参数化设计在静态建模中的运用。

现有一个直径46 m、高18 m 的圆柱体建筑,维护结构采用玻璃幕,设计者希望用金属格栅对外立面进行包裹,并通过格栅的长短和疏密来表现一种流动曲线的外立面效果,最终展现效果如图6、图7 所示。

图6 圆柱体格栅效果图

图7 圆柱体格栅展开图

利用动态组件功能,可以设定单个格栅为单元组件,设置格栅组件的坐标轴为建筑主体顶部的圆心,通过“Copies”属性对格栅进行环绕复制,引用复制体的编号作为自变量,使用正弦函数得到目标曲线,并将最终计算结果输出给格栅复制体的位置属性“Z”和长度属性“LenZ”。格栅组件的完整属性表如表1所示,对应的效果如图8 所示。

表1 格栅组件的属性表

图8 组件属性及最终效果

本设计需要解决的关键问题是曲线的描述,预期效果中所有的曲线均可基于正弦函数生成。其中总共有三条曲线,分别为上半部分的底曲线、下半部分的顶曲线和底曲线,如图7 所示,其分别可描述为“sin(COPY*360/480*3+90)*200-600”“sin(COPY*360/480*3)*200-500”“sin(COPY*360/480*3+90)*100-1300”,如图9 所示。由于正立面的表皮格栅向上掀起形成入口,因此可以通过COPY 的取值范围选择性地设定曲线在竖直方向上的倍数来实现该效果,于是下半部分底曲线可以利用条件函数调整为“IF(OR(COPY <80,COPY >400),sin(COPY*360/480*3+90)*300-1100,sin(COPY*360/480*3+90)*100-1300)”。

图9 格栅轮廓曲线函数

行为属性Copies 在使用时会生成一个名为“COPY”的只读属性,Copies 本身的值代表复制操作所生成的副本数量,COPY 则表示副本的编号,即距离组件本体最近的副本的COPY值为“1”,以此类推,最后一个副本为“239”,加上本体,总共得到了240 个格栅组件。COPY 值在组件的复制中有很重要的意义,很多变化都需要以该值作为自变量套入函数进行运算。

灵活设定自定义属性可以让单条公式更加简洁,嵌套公式结构更清晰,便于开发者整理思路,也有利于提高程序的运行效率。本案例中的a、b、c 属性分别对应的三条曲线函数;a1、b1 分别通过取二者最小值和最大值的方式修正填充重叠部分,如图10 所示;SX 用来判断COPY 的奇偶数,以识别格栅处于上半边或下半边。

图10 曲线修正填充重叠部分前后对比

本次案例中用到了多处逻辑函数来实现复杂情况的判断和执行。在开发中用到频率最高的逻辑函数为条件函数“IF()”,它通过判断逻辑表达式的真假来反馈不同的结果,是程序设计中条件结构的表现。在逻辑表达式中也经常用到“与”“或”“非”三种组合状态,在c 属性中就通过“与”函数“OR()”得到两个逻辑表达式的并集。

3.3.2 参数化动态道路线应用

本节通过制作一个可以根据缩放自动变化的动态道路线为例简述参数化设计在动态建模中的运用。

在实际工作应用中,经常需要对3D 模型场景中的道路进行建模,对于道路而言,最复杂的建模部分是道路线。道路线由道路中心双实线、非机动车道实线、单方向车道间虚线、停车线、斑马线等元素构成,各元素之间相互影响和制约。我们希望通过SketchUp 动态组件功能对整个道路线进行参数化设计,使其能够按预定的长度和宽度自动匹配合适的道路线,最终效果如图11 所示。

图11 动态道路线的三种效果

动态道路线的主要输入方式是用户对道路线的拉伸缩放操作,通过缩放更改了道路线整体的X 与Y 轴方向的尺寸,计算出道路线中每一部分元素的尺寸、位置、可容纳的车道数,最终将每一部分的尺寸、位置和数量输出到对应的属性中,使模型呈现预期的效果。此操作除了使用Copies 属性、几何属性和常规的数学运算外,还需要做好不同组件之间信息的传递和共享,必要时可借用父级传递属性信息。

一套完整的道路线涉及到的元素比较多,我们分别对其创建了组件,组件嵌套结构如图12 所示。道路线的完整属性表如表2 所示,效果如图13 所示。

表2 道路线中各组件的属性表

图12 道路线组件嵌套结构

图13 道路线大组件及其组件属性

不同于首个案例,本设计增加了一个活动的输入方式,即组件的尺寸。因此,整个道路线组件中会出现很多不确定变化,所以开发者应当考虑到每一种可能出现的情况,并运用合适的函数和结构对不同的情况作出不同的反馈。

本案例还涉及到大量的跨组件信息传递,在同组件中传递信息时,直接在公式中输入属性名称即可。当需要跨组件传递信息时,则需要在属性名称前添加来源组件的名称,并在中间用半角字符“!”隔开。例如“道路线!LenX”,在操作时也可以直接点击需要引用的属性,软件会自动生成正确的引用格式。需要注意的是,这种传递只能在父级组件与子级组件之间进行,隔代和并列的两个组件之间是不能直接交换信息的,如图14 所示。对多次使用的表达式创建一个自定义属性也是设计的重要技巧之一。

图14 跨组件传递信息

4 SketchUp 动态组件的优势与局限性

4.1 SketchUp 动态组件的优势

1)易掌握。它的设计逻辑与市面上大多数参数化设计软件不同,由于使用类似Excel 的属性表形式,对于可以熟练使用Excel 的参数化设计初学者来说是易理解和掌握的。

2)兼容性高。由于是内置于SketchUp 软件的官方工具,其兼容性较高,参数化程序可以直接存储在skp 文件中,对比Grasshopper 无需额外独立保存参数化程序文件,如图15 所示。

图15 Grasshopper 需要额外独立保存参数化程序文件

3)简化工作流。凭借SketchUp 软件在建筑设计领域的广泛应用,其生成品可以快速对接各类其他软件,减省了多余的转换,较大程度简化了工作流。

4.2 SketchUp 动态组件的缺陷

1)界面直观性不足。数据流式参数化工具采用更为直观的图形化编程,无需或较少需要开发者手动编写公式及代码,更低的学习成本和更便捷的操作有利于开发者专注于3D 建模设计本身。SketchUp 动态组件采用类似Excel 公式表格的形式,虽然可以让熟悉Excel 的用户快速理解和上手,但是整体编程效率和程序可读性较差,出现问题时不易锁定问题所在位置,对于没有基础的设计者难度则更大。

2)拓展性不足。虽然SketchUp 动态组件内置了大量组件属性接口和丰富的函数表达式,但它并不能通过借助第三方程序开发工具增添更高级功能,这也导致了较少有扩展插件可以直接对接SketchUp 动态组件[14]。主流参数化工具Grasshopper 拥有丰富的扩展性,可以直接创建C#、VB 或Python 脚本电池组[15](图16),用专业的程序语言对参数化设计功能进行拓展,同时丰富的拓展程序也使其能较轻松地实现多种复杂功能。

图16 Grasshopper 原生的编程语言脚本

3)运算效率较低。SketchUp 动态组件在运行过程中的计算速度比较慢,经常在修改一个参数的时候出现Working 进度条(图17),甚至在复杂的组件中可能会导致SketchUp 程序的崩溃,导致参数化开发和调试过程中的体验感下降。这制约了动态组件的参数化建模能力,致使其难以处理复杂的参数化建模问题。

图17 Working 进度条

4.3 参数化设计的便利性探讨

参数化设计建模按照目的可分为两类:一次性静态建模和多次性动态建模。一次性静态建模是为了实现某种造型而使用参数化工具辅助建模,它的开发仅仅适用于特定建筑方案,并不具有通用性和普适性,它的价值主要在于通过参数化辅助构建了较难直接建模的模型,如3.3.1 节中参数化建筑表皮的应用案例。多次性动态建模可以做到一次设计多次使用,即将经常在模型中重复使用的元素进行参数化设计,通过参数满足其在不同场景中的变化需求。此类建模在设计开发过程中会遇到更多问题和挑战,需要考虑的情况也更多,但最终的收益也较大,例如3.3.2 节中动态道路线的应用案例。

由于参数化设计和开发本身也需要耗费较多的时间精力,因此在建模时不宜盲目选择参数化设计的方法,很多不适合参数化处理数据的场景中使用参数化反而效率较低。当采用参数化设计时应优先考虑多次性动态建模,以便后期还能重复利用。总之,需要提前对成本和收益做好评估,选取合适的方式高效完成工作。

5 结语

SketchUp 动态组件凭借其独有的开发逻辑在参数化建模软件中获得关注。虽然它在某些方面与主流参数化建模软件有差距,但它基于应用广泛的SketchUp 软件平台,拥有极大的用户数量和良好的兼容性,SketchUp 动态组件依然可在工作中提供新的问题解决思路。不同的参数化设计软件有各自的特点和使用方法,但其基本逻辑却在很多平台上通用。结合计算机程序设计原理,归纳对比不同参数化软件的特点,灵活运用参数化设计技巧,最终可实现更加高效的建模设计。

注:感谢河北省高等学校人文社会科学重点研究基地——石家庄铁道大学人居环境可持续发展研究中心对本文的支持。

猜你喜欢
表达式组件动态
国内动态
无人机智能巡检在光伏电站组件诊断中的应用
国内动态
国内动态
新型碎边剪刀盘组件
一个混合核Hilbert型积分不等式及其算子范数表达式
表达式转换及求值探析
U盾外壳组件注塑模具设计
动态
浅析C语言运算符及表达式的教学误区