CityEngine规则文件(.cga)完全解读:从‘看不懂’到能改‘屋顶样式’和‘楼层高度’
CityEngine规则文件(.cga)完全解读:从‘看不懂’到能改‘屋顶样式’和‘楼层高度’
当你在CityEngine中看到那些自动生成的建筑群时,是否曾想过:"如果能自定义屋顶形状,让商业区有更多平顶,住宅区有更多坡顶该多好?"这正是CGA规则文件的魅力所在——它像一本建筑师的参数化设计手册,让你用代码定义城市形态。本文将带你拆解这份"建筑基因图谱",重点突破屋顶样式与楼层高度的自定义逻辑。
1. CGA规则文件的结构解剖
打开一个.cga文件,你会发现它由几个关键部分组成:
// 属性定义(用户可调参数) attr Roof_Form = "gable" // 屋顶类型 attr Floor_Ht = 3.7 // 层高(米) // 常量与函数(计算逻辑) const unitScale = 1 // 单位换算系数 _getInitialHeight = geometry.area/10 // 根据基底面积计算初始高度 // 规则系统(建模流程) StartRule --> extrude(Eave_Ht) // 拉伸到屋檐高度 comp(f){ side: Facade | top: Roof } // 分解为立面与屋顶关键点:attr开头的属性会在CityEngine界面显示为可调节参数,而rule部分则像乐高说明书,告诉引擎如何一步步"搭建"建筑。
典型修改场景:当需要统一修改所有建筑的层高时,只需调整Floor_Ht的默认值,无需改动规则逻辑。
2. 屋顶样式的深度定制
原始规则中预设了15种屋顶类型,从常见的平顶、坡顶到复杂的曼萨德式屋顶:
// 屋顶类型枚举定义 @Range("flat","gable","hip","mansard"...) attr Roof_Form = "gable" // 规则派发逻辑 Roof --> case Roof_Form == "gable": GableRoof case Roof_Form == "mansard": MansardRoof ...实战修改1:增加自定义屋顶比例
假设要让住宅区80%使用坡顶,20%使用平顶:
_getInitialRoofForm = case Usage == "Residential": 80%: "hip" // 坡顶 else: "flat" // 平顶 else: "gable" // 其他类型建筑默认用山墙顶实战修改2:创建混合屋顶
通过规则组合可以实现更复杂的形态,例如底部坡顶+上部平顶的混合设计:
CustomRoof --> split(y){ '0.7: roofHip(45) // 下部70%高度做45度坡顶 | '0.3: RoofPlane // 上部30%做平顶 }提示:修改后点击"Generate"实时预览,建议先在小范围地块测试效果
3. 楼层高度的动态控制
建筑高度通常由两个因素决定:总高度(Eave_Ht)和层高(Floor_Ht)。规则文件中通过数学关系建立动态逻辑:
| 属性 | 说明 | 典型值 | 计算公式示例 |
|---|---|---|---|
| Eave_Ht | 屋檐高度 | 20m | 基底面积/15 |
| Floor_Ht | 标准层高 | 3.5m | 固定值 |
| Nbr_Floors | 计算层数 | 6 | Eave_Ht/Floor_Ht |
动态调整技巧:
// 根据建筑用途设置不同层高 attr Floor_Ht = case Usage == "Office": 4.2 case Usage == "Residential": 3.3 else: 3.7 // 自动计算楼层数并取整 report("Nbr of Floors", rint(Eave_Ht/Floor_Ht))退台效果实现:
SetbackTop --> split(x){ '0.2: Extrusion(Eave_Ht-2*Floor_Ht) // 两侧退台 | ~1: Extrusion(Eave_Ht) // 中间主体 }4. 建筑形态的进阶控制
除了高度和屋顶,建筑体量形态也值得关注。规则中通过Building_Form属性控制体量变化方式:
Footprint --> case Building_Form == "setback top": SetbackTop case Building_Form == "setback everywhere": SetbackAll else: Extrusion(Eave_Ht)体量变化类型对比表:
| 类型 | 效果 | 适用场景 |
|---|---|---|
| extrusion | 简单拉伸 | 低层建筑 |
| setback top | 顶部退台 | 高层公寓 |
| setback facade | 立面凹陷 | 商业综合体 |
| setback everywhere | 多级退台 | 超高层地标 |
自定义体量规则示例:
// 根据高度自动选择形态 _getInitialBuildingForm = case Eave_Ht < 30: "extrusion" case Eave_Ht > 100: "setback everywhere" else: "setback top"5. 规则调试与优化技巧
当修改规则不生效时,建议按以下流程排查:
- 检查属性继承:确认修改的属性未被其他规则覆盖
- 验证条件分支:使用
report()输出中间值 - 简化测试场景:先用单个建筑地块测试
// 调试输出示例 DebugRule --> report("Current Height", Eave_Ht) report("Roof Type", Roof_Form) StartRule性能优化建议:
- 复杂屋顶类型对性能影响排序:穹顶 > 拱顶 > 多坡顶 > 单坡顶
- 超过20层的建筑建议使用LOD简化模型细节
在完成所有修改后,可以点击菜单"File > Export Rules"将自定义规则保存为新的.cga文件,方便后续项目复用。
