
简介这份规则库服务于CityEngine三维城市建模场景面向需要批量生成大楼与厂房的规划设计师、GIS开发者和三维建模人员。核心价值在于通过预设的CGA规则与配套模型资产让用户快速构建符合规划条件的高层建筑与工业厂房减少重复手工建模。压缩包共1257个文件约232.69MB主要包含725个JPG贴图、172个OBJ三维模型、134个PNG纹理、84个MTL材质定义以及17个CGA规则和11个CGB编译规则等其中CGA/CGB负责建筑形态与立面细节OBJ/MTL提供可复用几何与材质JPG/PNG增强表面真实感。目前已有443人学习下载。规则内容覆盖高度限制、形状模板、立面细节、随机化、空间布局、场地覆盖及光照分析等维度另外附带地理数据库辅助文件。用户可直接套用现有规则也可修改参数形成个性化方案在体量推敲、效果展示和街区尺度城市设计中能有效节省时间、提升效率。1. CityEngine规则库不是模型库——先搞清它解决什么问题很多人拿到“Cityengine大楼与厂房规则库.zip”习惯性以为它是模型库解压后拖进场景就能用。实际上这个压缩包里装的是一套CGA规则程序输入地块轮廓线输出带立面、屋顶、楼层划分的建筑体量。一块地和一千块地的生成成本几乎一样改参数就是改方案但第一次上手的人往往找不到入口以为文件坏了。这个规则库解决的是批量与可控几十栋办公楼和厂房手工建模按周算CGA规则按分钟算方案要改改参数而不是改模型。适合做城市设计比选的规划师、三维GIS与数字孪生底盘的工程师、大面积场景的美术与开发者。如果只想精修一栋单体、追求渲染级细节这套规则库不是为你准备的。2. 规则库内部怎么组织CGA文件的分层与变量设计2.1 一栋楼是怎么被拆成规则的手工建模顺序是“体块—立面—细部”CGA规则反过来是由外壳向内生长从地块线开始先拉伸成体量再拆出面再在面上切分楼层和窗户。要读懂这套大楼与厂房规则库先掌握CGA的四个核心动作extrude拉伸、comp拆面、split切分、asset贴图资产。几乎所有的楼宇规则都建立在这四个动作的组合上。一段典型的大楼主干规则会这样写/* * 大楼主干规则从地块线到完整体量 * 分层底座裙房 标准办公层 屋顶设备区 * 文件rules/building_main.cga */ StartRule Building -- extrude(world.y, BuildingHeight) comp(facade) { front: MainFacade | side: MainFacade | top: RoofAssembly } MainFacade -- split(y) { BaseHeight: BaseFloor | ~FloorHeight: OfficeFloor | RoofHeight: RoofParapet }*逻辑说明第一行将地块按BuildingHeight高度拉伸成体块第二行用comp把体块拆成正面、侧面和顶面各交给后续规则第三行把立面沿Y轴切成三段——底部固定高度的裙房、中间按楼层高度循环的办公层、顶部女儿墙。~FloorHeight前面的波浪号表示“自适应均分”意思是总高度扣掉底座和女儿墙后有余数时系统会尽量按FloorHeight均匀分配而不是死板地数楼层。参数说明这段规则在实际项目里对应图层属性面板中的BuildingHeight、BaseHeight、FloorHeight、RoofHeight四个字段。我一般会把层高设为先决参数其余高度尽量由函数推导而不是让使用者逐个填。比如总高度可以写成/* * 把总高度改写为底座 层数 * 层高 屋顶 * 这样改方案只需要动两个参数不容易出现高度对不上层数 */ BuildingHeight BaseHeight FloorHeight * FloorCount RoofHeight参数说明FloorCount是楼层数用这个表达式后用户调整层高或层数总高度自动更新。实际经验里规则库放在项目里最容易出问题的地方不是语法而是参数之间互不联动——改了一个指标整套方案失真。继续往下标准层要生成窗户核心是水平切分/* * 标准层立面竖向分割成墙—窗—墙的重复带 * 思路先在X轴方向排布窗间墙和窗扇再细分窗扇 */ OfficeFloor -- split(x) { WallWidth: Wall | ~WindowWidth: Window | WallWidth: Wall }*逻辑说明split(x)在水平方向上切分把每一层分成“墙—窗—墙”的重复带。这个写法很常见但实际项目中真正决定立面质感的是转角处理在comp(facade)时front和side分开生成角落不连续开窗否则转角处会出现贴图接缝或窗台穿帮。很多自制规则翻车都翻在这里。2.2 大楼与厂房规则库为什么分成两套算法大楼规则强调竖向分段与标准层节奏厂房则完全换了一套逻辑。厂房通常是大跨度、低密度、大面积实墙立面重心在高窗带与大门入口。用大楼规则去生厂房结果往往是满墙玻璃的“办公楼式工厂”在规划可视化里一眼假。所以这个规则库把两套逻辑分得很开不但立面算法不同参数体系都不共用。一行厂房主干规则是这样/* * 厂房主干规则从地块到长边立面 * 参数檐口高度、屋脊高度、墙板分格、高窗带高度 * 屋顶单独生成避免坡屋面把立面切穿 */ StartRule Factory -- extrude(world.y, EaveHeight) comp(facade) { front: FactoryShort | side: FactoryLong | top: RoofFactory } FactoryLong -- split(y) { PlinthHeight: SolidPlinth | ~PanelHeight: MetalPanel | WindowBandHeight: HighWindow }*逻辑说明extrude只拉伸到檐口高度屋顶在comp的top分支里单独生成这样坡屋面不会与立面打架立面切成勒脚实墙、金属面板和高窗带三段金属面板用~PanelHeight按地块长度自适应均分高窗带固定高度压在最上面。参数说明EaveHeight檐口高度与RidgeHeight屋脊高度是两个独立参数。我在实际项目中坚持让用户分别设置因为规划报批和天际线控制用的指标不一样合并成一个数值反而麻烦。大楼与厂房的参数差异可以总结成一张表对比维度大楼规则厂房规则高度体系底座 层数×层高 屋顶檐口 屋脊两个独立指标立面组织标准层循环重复勒脚、墙板、高窗三带屋顶类型平顶、退台、设备机房坡屋面、女儿墙、彩钢顶批量参数层高、层数、退线檐口高度、跨度、开间数拿到规则包后第一件事不是调参数而是先确认当前地块该用哪一套入口规则。选错入口后面所有参数都是白调。3. 在CityEngine里跑通规则库导入、绑定与首次生成3.1 导入规则包并与地块图层绑定压缩包里有规则文件、资产贴图/模型和文档。最稳妥的做法是先解压到项目目录保持规则文件和assets资源的相对路径不变再在场景管理器中绑定图层。直接在CityEngine里导入rpk也能跑但资源路径容易断。反复导入多个项目时我会用Python控制台脚本避免每次点菜单# CityEngine Python控制台批量导入地块并绑定规则包 # 注意不同CityEngine版本的API名称可能有差异以你本地控制台提示为准 scene ce.get_scene() # 规则包路径按你机器上的真实位置改 rpk scene.get_file(data/rules/buildings_factory.rpk) # 导入已有地块图层Shapefile或GeoJSON layer ce.import_files(/path/to/parcels.shp, typeshp) # 把规则包作为图层规则挂上去 ce.set_layer_rule(layer, rpk) # 刷新视图让生成器识别新规则 ce.refresh()逻辑说明这个脚本的核心作用是把“地块文件—图层—规则包”三者绑定。如果不写脚本界面操作就是右键图层→Assign Rule Package。脚本方式的好处是重复项目可复用特别是同一批地块要试多版规则时直接改路径重跑即可。参数说明import_files的type参数明确文件类型set_layer_rule决定地块用哪套规则生成。如果有多个图层务必确认layer对象指向目标图层否则规则会挂到别的数据上生成结果完全对不上。绑定完成后打开图层属性面板确认规则参数列已经出现。如果只看到默认值说明规则包里的attr变量已经暴露成功如果连参数列都没有回到上一步检查规则包是否真的绑定到了当前图层这是新手最容易卡住却最常忽略的一步。3.2 首次生成前——大楼与厂房规则库里四个必填参数规则绑定后选中一个地块在属性面板的规则页签中会看到BuildingHeight、FloorHeight、WindowWidth等字段。最容易踩的坑是全部保持默认直接点Generate结果生成一个高度离谱、窗户密到不可用的体块。正确做法是先填四类基础参数高度、层数、退让、屋顶类型。我第一次用这类规则库时常用的参考初值参数作用初次建议值BuildingHeight建筑总高36米约9层办公FloorHeight标准层层高4.2米Setback退地块线距离3米RoofType屋顶类型0平顶带女儿墙这些值填好后先只选一个地块生成。确认体量、立面、屋顶都正常再全选所有地块批量Generate。不要一开始就在几百个地块上跑不然一旦规则有问题排查成本会翻好几倍。提示在大楼与厂房规则库里所有CGA规则默认按米计。如果地块数据是经纬度坐标先把图层投影到合适的米制坐标系再生成否则高度值会变成“度”体块直接飞走。第一次生成出来的体块如果楼板厚度、窗台高度看起来别扭不要急着改规则文件先检查参数。参数能解决的问题不要动代码代码层面的改动一定要在当前场景里保留一个“已知可用”的版本再继续否则改坏了没有后悔药。4. 大楼规则调优层高、立面与屋顶的实战参数4.1 层高与立面分割参数联动调整进入大楼规则页面你看到的参数会比第3章多不少。最值得先调的是层高、窗下墙高度和窗楣高度这三个。很多人只改层高不改窗下墙结果玻璃高度跟着层高变窗台比例失调整个立面看起来很怪。正确的做法是把玻璃高度写成推导值而不是手填/* * 立面参数联动窗高 层高 - 窗下墙 - 窗楣 * 改层高时玻璃自动适配不会出现窗台过高或玻璃顶到楼板 */ WindowHeight FloorHeight - SillHeight - HeaderHeight逻辑说明SillHeight是窗下墙高度HeaderHeight是窗楣高度。层高一旦变化WindowHeight自动随动不需要手动改第二个值。这条推导式写进规则后属性面板里WindowHeight会变成只读状态改FloorHeight就能同时影响整栋楼的立面比例。参数说明SillHeight一般取0.6~0.9米办公楼的窗台高度通常比住宅略高取0.8比较常见。HeaderHeight控制在0.3~0.5米。如果规则库里没有这条联动我的习惯是在规则文件顶部自己补一行因为这种参数之间的隐性依赖在项目交接时最容易出问题。立面的开窗密度也值得仔细调。开窗密度 窗户宽度 /墙宽 窗户宽度× 100%。办公楼立面开窗密度在40%~60%之间比较正常超过70%立面会碎渲染出来满屏窗框而且采光过于夸张低于30%看起来像仓库而不是办公。4.2 屋顶、退台与天际线效果的控制开关屋顶是大楼规则库里最容易出效果也最容易出bug的部分。规则库通常不是简单盖一个平顶而是根据RoofType参数分支输出平屋顶、退台或坡屋顶。看懂这个分支你就掌握了整栋楼的天际线。/* * 屋顶分支按枚举参数切换造法 * RoofType 0 平顶带女儿墙 * RoofType 1 退台 * RoofType 2 坡屋顶 */ RoofAssembly -- case RoofType 0: extrude(world.y, ParapetHeight) Parapet case RoofType 1: setback(roof, SetbackStep) Mass comp(facade) { top: RoofAssemblyInner | all: RoofEdge } case RoofType 2: roofGable(30) GableRoof else: NIL逻辑说明用case分支处理屋顶类型是规则库中常见的状态开关写法。参数为0时生成女儿墙为1时逐层退台形成露台和上部体量为2时生成30度坡屋顶。用户只需要改一个整数不需要理解背后的造型拆分。参数说明RoofType是枚举值建议在属性面板里绑定下拉框不要直接输入数字。实际项目中我还习惯再加一个RoofEdgeHeight参数控制屋顶女儿墙或栏杆高度。这个值直接影响建筑高度计算规划方案中很敏感很多项目中屋顶设备间的高度也会被计入限高所以屋顶参数一定要独立暴露出来。做方案比选时天际线的微调非常快想压低一栋楼改FloorHeight或FloorCount想让塔楼更有层次把RoofType改成1并加大SetbackStep想做出办公楼的现代感把RoofType保持0同时把ParapetHeight调高到1.8米视觉上会有很明显的框边效果。这里有一个玄学经验规则库调了参数后生成结果偶尔看起来“差不多但不对”——比如退台位置偏移了半层。这通常不是参数错了而是某个中间属性被上一次生成缓存。此时先执行一次Reset再Generate很多诡异现象都能消失。5. 厂房规则避坑与常见问题排查5.1 厂房立面批量生成后破面、闪烁怎么办现象多栋厂房批量生成后相邻地块边界出现黑色缝隙、三角破面旋转视角时闪烁。单栋生成时一切正常一批量就不对。原因一是地块之间本身不重合但有极小微缝而厂房规则里屋顶和墙体分别生成屋顶面略微小于地块二是屋顶与立面交界处出现Z-fighting两个面在同一高度重叠深度测试不稳定。这种问题在透视远视角时不明显一旦拉近旋转就露馅。解决分两步。第一步是先做地块拓扑处理让相邻地块共享边界这条在GIS数据进入CityEngine之前就要完成。第二步是在规则里让屋顶外扩盖住缝隙/* * 屋顶外扩方案先把顶面提取出来再向外扩0.1米后拉伸 * 这个处理能有效消除立面与屋顶交接处的缝隙闪烁 */ RoofFactory -- comp(facade) { top: RoofDeck } RoofDeck -- offset(0.1) extrude(world.y, 0.3) comp(facade) { top: CoverFinish | side: RoofEdge }逻辑说明comp(facade)取到屋顶平面后offset(0.1)把多边形向外扩10厘米再拉伸0.3米形成屋面厚度。这样屋顶边缘会盖住墙顶缝隙同时多出来的厚度让屋面在视觉上有层次不会出现一条细线。参数说明0.1这个偏移量不是万能的。如果地块容差大于10厘米要同步加大我一般取地块容差的2~3倍。拉伸厚度0.3米是民用建筑屋面的常见构造厚度如果你做大型厂房屋面板加保温层会更厚调到0.5米也不过分。5.2 CGA规则报错三个典型原因与排查顺序现象一生成时提示语法错误指向某个case或split行。原因多半是规则文件与当前CityEngine版本不兼容——老版本不识别StartRule、Hidden这些新属性或者新规则用了旧版没有的算子。解决用CityEngine自带的CGA Editor打开规则文件检查文件头部是否声明了版本兼容范围不要用系统记事本修改CGA文件编码另存为时编码一变中文注释可能直接报错。现象二体块生成了但贴图全黑或缺失。原因不是模型问题而是assets路径断裂。很多人只把rpk拖进项目忽略了zip里的assets目录需要一并导入。解决解压后保持目录结构把assets资源放进CityEngine项目目录再检查规则里引用的贴图文件名与实际文件大小写是否一致。Windows下文件名不区分大小写问题不大但项目中资源一旦有拷贝改名路径就会断。现象三同一个地块有的生成了有的空白。原因通常是地块面积或宽度小于规则里split的最小尺寸。比如开间宽度小于墙宽加窗宽的两倍split(x)无法落位整个分支静默失败。解决给规则补一个容错分支/* * 容错分支地块过小时放弃立面细分整体按墙板出材质 * SmallParcelThresh 按项目最小可建地块面积设置 */ OfficeFloor -- case geometry.area SmallParcelThresh: Wall else: split(x) { WallWidth: Wall | ~WindowWidth: Window | WallWidth: Wall }*逻辑说明用geometry.area做面积判断过小地块直接整面出墙材质避免split因空间不足而失败。SmallParcelThresh的值一般取30~50平方米按项目实际最小地块面积调整。参数说明这个容错分支放在OfficeFloor层意味着即使地块不规整至少也会生成一面墙而不是留下一个空体块。排查批量生成问题时先把这种“静默失败”的规则分支找出来大多数空白地块的问题都能解决。排查顺序我给一个固定习惯先看场景管理器里是否有规则生成日志再选中一个空白地块单独Generate看是否复现最后打开规则文件逐条检查case分支。这个顺序可以稳定筛掉八成问题。6. 让规则库真正成为生产力数据驱动与批量验证技巧把大楼与厂房规则库用成生产力关键在数据驱动。我的习惯是把建筑高度、层数、屋顶类型这些关键参数直接映射到地块图层的属性表字段而不是在规则里写死。规划部门给一版控规数据字段直接驱动建筑生成同一个规则库可以适配不同城市数据。规则里用attr声明把字段暴露出来/* * 字段驱动地块属性表里有height字段、floors字段 * 直接作为建筑生成参数比手写常量更符合批量项目 */ StartRule Building -- case height 0: extrude(world.y, height) else: extrude(world.y, BuildingHeight)逻辑说明这里的height是图层属性字段由外部的GIS数据带入。规则读不到字段值时回落默认BuildingHeight避免地块属性缺失时什么都不生成。参数说明字段名大小写要和属性表完全一致否则CityEngine会把它当成未知变量直接报错。字段映射做完后用高度着色看一眼整片地块的体量分布确认天际线大致符合方案再全量生成。另一个习惯是导出前的验证先抽三个不同位置的地块单独生成再用场景统计工具检查是否存在零面积体块或异常高度值。我见过不少同学在这上面栽过跟头因为偷懒没做字段映射手动调了三百多栋参数花掉整整两天后来老老实实先把属性表挂好半小时跑完一轮方案比选。规则库本身只是工具真正决定效率的是你怎么组织输入数据。希望这篇能帮你把大楼与厂房规则库用得顺手少走几个弯路。本文还有配套的精品资源点击获取