简介这份资源是面向Cityengine用户的城市规划规则库工具包适合从事三维城市建模、景观设计及规划方案推演的设计师与学习者使用可帮助快速扩展或定制城市生成规则降低从零编写CGA脚本的门槛。压缩包共8个文件约36KB包含cgb规则二进制文件、cga规则脚本、xml配置、project工程文件及pydevproject开发配置等覆盖规则定义、工程组织与脚本开发等环节导入后即可在Cityengine中调用并调整参数。目前已有1109人学习下载具备一定参考价值。借助其中的规则集与工程结构读者可研究地形、建筑、道路等规则的编写思路结合CGA语言与Python API进行二次开发实时预览不同规划方案的城市景观效果并集成GIS数据开展光照、视线与密度分析为城市规划、交通规划及虚拟场景制作提供可复用的规则基础。1. 拆开这个 Cityengine 城市规划规则库它到底能省掉哪几步重复劳动如果你做过三维城市建模大概率经历过这种循环拿到一块地形和路网手动拉体块、切立面、调高度改一版方案就要重来一遍。Cityengine 的城市规划02规则库本质就是把这套重复劳动打包成一套可复用的 CGA 规则集配合 assets、data、scenes、rules、scripts 这些目录让你导入后直接跑出成片的城市肌理。它面向的是做城市规划、景观设计、影视场景预演的从业者尤其是需要快速出多方案对比的人。压缩包里带 .project、.pydevproject、.resolvemap.xml 这些工程文件说明它不是零散脚本而是一个能直接在 Cityengine 里打开的完整工程。下面我按自己拆包和跑通的顺序把规则库的结构、参数、坑点讲清楚。2. 规则库目录结构与 CGA 规则驱动逻辑2.1 从压缩包目录看工程组织方式拿到城市规划02.rar解压后目录大致是这样分布的先认清每个目录的职责后面改参数才不会找错地方目录/文件作用是否要动rules存放 CGA 规则文件城市生成的核心逻辑主要修改对象assets模型、纹理等素材资源一般不动dataGIS 数据、地形、路网等输入数据按项目替换scenes场景文件保存相机、图层、规则分配打开入口scriptsPython 脚本做批量处理或数据转换进阶用models生成后的模型输出只读maps/images贴图与参考图一般不动.project/.pydevproject工程配置标识项目根不要删.resolvemap.xml资源解析映射指向素材路径路径变了要改.resolvemap.xml这个文件容易被忽略它记录的是资源相对路径的解析规则。如果你把工程挪到别的盘符或目录层级Cityengine 找不到纹理和模型多半就是这里没对上。常见做法是保持解压后的目录层级不变或者用 Cityengine 的工程重定位功能重新指一遍。2.2 CGA 规则是怎么把地块变成建筑的Cityengine 的核心是规则驱动CGAComputer Generated Architecture是它专用的脚本语言。规则库里的每条规则本质是一组「形状 → 操作 → 新形状」的推导。举个最简化的建筑体块规则帮你理解规则库里那些文件在干什么// 建筑体块生成规则示例 attr height 30 // 建筑高度可外部传入 attr floors 10 // 楼层数 Lot -- // 从地块形状开始 extrude(height) // 按高度拉伸成体块 Comp(f) { top: Roof | // 顶面交给 Roof 规则 side: Facade } // 侧面交给 Facade 规则 Roof -- color(0.6, 0.6, 0.6) // 屋顶赋灰色 setback(2) { all: NIL } // 内缩 2 米 Facade -- split(y) { ~floors: Floor } // 沿高度按楼层切分 Floor -- split(x) { ~1: Window | ~1: Wall } // 每层切窗户和墙逻辑说明Lot是入口规则对应地块。extrude把平面拉成三维体块Comp(f)把体块拆成顶面和侧面分别处理。split(y)沿垂直方向按楼层切~表示按比例自适应。参数说明height和floors用attr声明意味着可以在 Cityengine 的检查器面板里实时改改完场景立刻重算这就是规则驱动比手动建模快的地方。规则库里的文件比这个复杂得多但拆开看都是这类推导的组合。2.3 导入规则库并跑通第一个场景步骤不复杂但顺序错了会白折腾解压后不要直接双击场景文件先在 Cityengine 里用File Import Cityengine Project把整个工程目录导入让.project被识别。打开scenes目录下的场景文件检查图层里地块是否正常显示。选中地块图层在 Inspector 面板的 Rules 栏里指定rules目录下的规则文件。如果规则没自动分配右键地块图层选Assign Rules手动指到对应.cga。改几个attr参数看场景是否实时更新。# 如果 scripts 目录下有批量处理脚本常见调用方式 # 注意路径按你实际解压位置替换 cd 城市规划02/scripts python batch_assign.py --scene ../scenes/city_02.cej --rules ../rules/building.cga这段脚本调用是常见做法具体脚本名和参数以你包里的为准。逻辑是批量给场景里的图层分配规则省去一个个手点。参数--scene指场景文件--rules指规则文件。跑之前先确认 Python 环境里装了 Cityengine 对应的模块否则会报导入错误。3. 参数调优让规则库输出符合你规划意图的城市3.1 建筑高度与密度参数怎么设规则库默认参数跑出来的城市往往和你项目的控规指标对不上。这时候要动的是规则里的attr变量。常见做法是先在 Inspector 面板里试试出合适的值再回写进 CGA 文件固化下来。以建筑高度为例规则库里通常会有类似attr maxHeight、attr minHeight、attr density这样的参数。maxHeight控制天际线峰值density控制地块内建筑覆盖率。调density的时候注意它影响的是体块占地比例不是容积率别直接拿它当 FAR 用。容积率要靠高度和覆盖率一起算。// 按控规指标约束建筑生成 attr FAR 2.5 // 容积率目标 attr siteArea 1000 // 地块面积可由 GIS 数据带入 attr coverage 0.4 // 建筑覆盖率 Building -- // 根据容积率和覆盖率反推高度 let h (FAR * siteArea) / (siteArea * coverage) extrude(h) Comp(f) { top: Roof | side: Facade }逻辑说明这里用let做了一次计算把容积率换算成高度。参数说明FAR、siteArea、coverage都可以从 GIS 属性表里读Cityengine 支持把地块属性直接映射成规则参数。这样改规划指标时不用手动改每个建筑改属性表就行。3.2 道路与地块的衔接参数道路规则负责街道宽度、交叉口形态。规则库里道路部分通常和地块是分开的两套规则衔接靠的是地块边界和道路中心线的对齐。常见坑是地块和道路之间有缝隙或重叠导致建筑压到路面上。处理办法是在道路规则里设attr sidewalkWidth人行道宽度在地块规则里设attr setback退线距离让两者相加等于道路红线到建筑的实际距离。如果跑出来建筑还是压线检查地块多边形是不是从道路中心线偏移生成的偏移量要和sidewalkWidth对上。提示改道路参数后地块不会自动重算边界需要重新生成一次地块图层否则退线还是按旧边界算。3.3 用 Python 脚本批量改参数项目多了以后一个个在面板里点不现实。scripts目录下的 Python 脚本就是干这个的。Cityengine 提供 Python API可以遍历场景里的图层和规则参数。# 批量修改场景中所有地块的建筑高度上限 from scripting import * cityEngine getCityEngine() # 获取当前场景 scene cityEngine.getCurrentScene() # 遍历所有地块图层 for layer in scene.getLayers(): if layer.getName().startswith(Lot): # 读取规则参数并修改 ruleParams layer.getRuleParameters() if maxHeight in ruleParams: ruleParams[maxHeight] 60 # 统一改成 60 米 layer.setRuleParameters(ruleParams) print(参数批量更新完成)逻辑说明先拿到当前场景再遍历名字以Lot开头的图层找到maxHeight参数统一赋值。参数说明maxHeight这个名字要和你规则文件里attr声明的一致不一致就找不到。跑之前建议先备份场景批量改参数没有后悔药。4. 避坑与常见问题排查4.1 导入后场景一片空白现象打开场景文件视图里什么都没有图层列表也是空的。 原因多半是.resolvemap.xml里的资源路径和你实际解压路径对不上Cityengine 解析不到数据。 解决用File Project Relocate重新指定工程根目录或者手动编辑.resolvemap.xml把路径改成相对路径。保持解压后的目录层级不变是最省事的做法。4.2 规则分配了但建筑不生成现象规则文件指定了地块也在但场景里就是不出体块。 原因地块图层的几何类型不对。CGA 规则入口通常要求是面polygon如果地块是线或点extrude直接失败。 解决检查地块图层的几何类型在图层属性里确认是 Polygon。如果是线先用Cleanup Polygonize转成面。4.3 纹理丢失显示为纯色现象建筑体块出来了但表面是灰的或纯色没有贴图。 原因assets目录里的纹理路径在规则里写的是绝对路径换机器后失效。 解决把 CGA 里的纹理引用改成相对路径或者用texture()函数时配合.resolvemap.xml的映射规则。常见做法是统一用相对工程根的路径。4.4 参数改了场景不更新现象在 Inspector 里改了attr值场景没反应。 原因规则没有真正绑定到图层或者改的是规则文件但没重新加载。 解决确认图层 Inspector 的 Rules 栏里有规则文件路径。如果改的是.cga文件本身需要右键规则文件选Reload或者重启场景。Cityengine 不会自动监听文件外部修改。4.5 生成速度慢到卡死现象地块一多改一个参数要等好几分钟。 原因规则里用了递归或大范围split每次重算都全量跑。 解决把不参与实时调整的部分用NIL或Comp提前终止减少推导层级。另外可以在 Inspector 里把预览精度调低出图时再调高。血泪经验是别在几万个地块的场景里实时拖参数先在小范围试好再全量跑。5. 进阶把规则库接进 GIS 数据流与批量出图规则库真正好用的地方是它能和 GIS 数据联动。data目录里放的就是这类输入。常见做法是把地块属性表里的容积率、用地性质、限高这些字段直接映射成 CGA 的attr这样改规划指标不用碰规则文件改属性表就行。# 从 GIS 属性表读取指标并写入规则参数 import csv from scripting import * cityEngine getCityEngine() scene cityEngine.getCurrentScene() # 读取外部指标表 with open(../data/parcels_metrics.csv, r, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: parcelId row[parcel_id] far float(row[FAR]) heightLimit float(row[height_limit]) # 按地块 ID 找到对应图层并写入参数 layer scene.getLayer(parcelId) if layer: params layer.getRuleParameters() params[FAR] far params[maxHeight] heightLimit layer.setRuleParameters(params)逻辑说明用 CSV 做中间格式把 GIS 导出的指标读进来按地块 ID 匹配图层写参数。参数说明parcel_id要和场景里图层命名规则一致FAR和height_limit要和 CGA 里的attr名字对上。这套流程跑通后一个片区的方案调整就是改 CSV 再跑一遍脚本的事。批量出图也是类似思路用 Python API 遍历相机视角逐个渲染导出。我一般会先固定几个关键视角比如鸟瞰、人视、沿街然后写个循环批量出图避免手动一张张调。从那以后我每次拿到新的规则库都强制先跑一遍最小场景验证路径和规则绑定再往大项目上套。希望帮到你。本文还有配套的精品资源点击获取