简介:Cityengine建筑规则库是一套面向三维城市建模与城市规划从业者、建筑可视化设计师的预设规则集合,用于解决大规模城市景观快速生成与建筑样式多样化的问题。压缩包共收录4061个文件,约395.68MB,以2686张jpg贴图、971个js脚本、151张png素材为主,并包含54个cga规则文件、29组obj与mtl模型材质、15个cgb二进制规则包及若干xml、txt配置说明,覆盖从建筑立面纹理到规则逻辑的完整素材链。目前已有1649人学习下载。使用者可直接导入规则包,通过调整建筑高度、宽度、屋顶类型与立面细节等参数,快速生成从住宅区到商业区、从低层别墅到高层摩天楼的多样化建筑群,并结合材质与光照完成真实感渲染,还可用于日照与视线分析等规划场景,将繁琐的建模过程简化为参数化定制,显著提升城市设计与影视特效制作效率。
1. 拿到 Cityengine 建筑规则库,先别急着双击
如果你正在做城市设计、规划报建或者影视场景,手头大概率堆着一堆体块模型,甲方一句“立面再丰富点”就能让你加班到凌晨。Cityengine 建筑规则库就是冲这个场景来的:它把建筑生成逻辑封装成一批 .CRP 规则包,导入后调参数就能批量出楼,而不是一栋一栋推拉门窗户。我这次拆的包是 2019.0 版本的规则集,里面塞了多套建筑样式,从住宅到商业都有覆盖。适合谁?做城市级建模的规划师、需要快速铺量的建筑表现从业者,以及想研究 CGA 规则写法的技术美术。不适合谁?只做单体精模、对每根装饰线脚都要手动控的人——规则库的强项是规模和多样性,不是毫米级雕刻。先把它当成“建筑生成器”,而不是“模型素材包”,后面所有操作才顺。
2. 规则库到底怎么跑起来:从 CRP 导入到参数面板
2.1 先认清 .CRP 不是模型,是生成说明书
很多人第一次拿到 Cityengine 建筑规则库,会下意识找 .obj 或 .fbx,结果发现全是 .CRP 文件,就以为下错了。这里得把概念掰正:.CRP 是 Cityengine 的规则包格式,本质是一个压缩容器,里面装着 CGA 规则文件、纹理贴图、资产引用和元数据。它不直接给你一栋楼,而是给你一套“怎么长出一栋楼”的逻辑。你给它一个地块形状,它按规则里的高度、退线、屋顶类型、立面分段去生成几何体。
我拆的这个 2019.0 包,文件命名是一串哈希值,比如0009a568b9a1001b156d946d295304cd这种。别被名字劝退,导入后 Cityengine 会读取内部的规则名称和缩略图。常见做法是先把整个文件夹放到工作空间的assets或rules目录下,再在 Cityengine 的 Navigator 面板里右键导入。注意不要直接双击 .CRP 文件,它不会自动关联到当前工程,容易报“规则包未注册”。
导入后你会看到规则包出现在 Rules 列表里,每个包对应一套建筑风格。点开属性面板,能看到一堆参数:height、width、depth、roofType、facadeStyle、floorHeight、groundFloorHeight等等。这些参数就是你和规则库对话的接口。新手最容易犯的错是只改height,结果楼是高了,但窗户还是原来那几扇,比例全崩。正确做法是成组调参:先定层高和层数,再调开窗密度,最后换屋顶。
2.2 用 CGA 规则文件做一次最小可复现导入
光说概念没用,下面是我实际跑通的一套最小流程。假设你已经装好 Cityengine 2019.0,并且把规则库文件夹解压到了D:\CE_Workspace\assets\building_rules。
第一步,新建一个场景,画一个矩形地块。可以用Polygon工具随手拉一个 40m × 30m 的面。
第二步,在 Navigator 里找到building_rules文件夹,右键选择Import Rules。如果面板里没有直接显示,就选File > Import > Cityengine > Rule Package,指向任意一个 .CRP 文件。Cityengine 会自动扫描同目录下的其他包。
第三步,把导入后的规则文件拖到地块上。这时会弹出规则分配对话框,选择Assign Rule File。如果规则包里有多个入口规则,比如Building_Residential、Building_Commercial,就按你的地块用途选。
第四步,选中地块,在 Inspector 面板里找到规则参数。下面是一段我常用的参数调整逻辑,用 CGA 伪代码表示,方便你理解参数之间的依赖关系:
// 入口规则:根据地块面积自动选择建筑类型 Lot --> case area < 800: Residential case area < 2000: Commercial else: Highrise // 住宅规则:先定层数,再算总高,最后生成立面 Residential --> set(height, floorHeight * floorCount) split(y) { groundFloorHeight: GroundFloor | ~1: UpperFloors } Facade // 立面规则:按开间宽度切分窗户 Facade --> split(x) { ~windowWidth: WindowTile }*这段逻辑说明几件事:floorHeight和floorCount共同决定总高,你单独改height会被规则覆盖;groundFloorHeight控制底商或门厅的高度,通常比标准层高;windowWidth决定立面竖缝的密度。参数说明:floorHeight一般设 3.0~3.6 米,groundFloorHeight设 4.5~6.0 米,windowWidth设 1.8~2.4 米。改完参数后按Ctrl+G重新生成,不要手动刷新,规则引擎会自己重算。
第五步,如果生成结果是一片空白,先检查地块法线方向。Cityengine 对反面地块不生成几何体。选中地块,在 Inspector 里把Normal翻转一下,或者用Align工具统一朝上。
提示:导入规则包后,建议先复制一份到工程目录再改参数。直接改原始 .CRP 里的规则,下次重新导入会被覆盖,血泪经验。
3. 参数化调参的四个关键维度:高度、立面、屋顶、环境关系
3.1 高度控制不是拉滑块,是算层高和退线
Cityengine 建筑规则库里,高度参数通常不是单一变量。我拆的这套规则,高度逻辑分三层:baseHeight(裙房高度)、towerHeight(塔楼高度)、totalHeight(总高)。如果你只调totalHeight,规则会按比例压缩层高,导致窗户被压扁。正确顺序是:先设floorHeight,再设floorCount,最后让规则自己算总高。
另一个容易翻车的是退线。城市设计里常有日照间距和消防退线要求,规则库一般提供setbackFront、setbackSide、setbackRear三个参数。我一般会先在地块上画一条退线参考线,量出距离再填参数。注意单位是米,不是百分比。如果填了 5,就是建筑轮廓从地块边界往里缩 5 米。填错会导致建筑悬空或压线。
3.2 立面细节靠 split 和 repeat,别硬堆模型
立面丰富度是 Cityengine 建筑规则库最值钱的地方。它用split和repeat两个操作符来切分墙面。split是按固定尺寸或比例切,repeat是按固定间距重复。比如你要做一排窗户,用split(x) { ~2.0: Window }*表示每 2 米切一个窗户单元。波浪号~表示弹性尺寸,最后一个单元会自动拉伸填满。
我见过有人为了立面细节,往规则里塞了几十个i()导入的装饰模型,结果生成一栋楼要等三分钟。规则库的正确用法是“用参数控制切分密度”,而不是“用模型堆细节”。把windowWidth从 2.0 调到 1.5,窗户数量就上去了,生成时间几乎不变。如果确实需要阳台、空调板这类构件,用i()导入低模,并且设置LOD参数,远景自动简化。
3.3 屋顶类型决定天际线,别只会平顶
规则库里的屋顶参数通常有roofType枚举:flat、gable、hip、shed、mansard。我拆的这套里,住宅默认是坡屋顶,商业默认是平顶。如果你把住宅的roofType改成flat,记得同时调parapetHeight(女儿墙高度),否则屋顶会像被削平一样突兀。
坡屋顶还有roofPitch(坡度)和overhang(挑檐)两个参数。roofPitch一般设 25~45 度,overhang设 0.5~1.0 米。挑檐太大在密集街区会穿模,太小又显得单薄。我一般会先按 0.6 米试,生成后切到立面视图看相邻建筑有没有打架。
3.4 和环境的关系:日照、视线、贴线率
Cityengine 建筑规则库不只是生成单体,它还能响应环境。比如shadow参数可以控制建筑是否参与日照计算,viewCorridor参数可以留出视线通廊。做规划分析时,我习惯把规则库生成的建筑和地形、道路一起放进场景,然后用Shadow Analysis工具跑一遍日照。如果发现某栋楼把北侧住宅挡死了,就回去调那栋楼的towerHeight或setbackRear。
贴线率是另一个常被忽略的参数。规则库里一般用frontageRatio表示建筑沿街面的连续程度。设 0.8 表示 80% 的沿街面有建筑,留 20% 做入口或广场。这个参数在商业街区特别有用,能避免生成一排“牙签楼”。
4. 避坑与排查:规则库不生成、生成错、生成慢怎么办
4.1 导入后规则列表是空的
现象:Navigator 里能看到 .CRP 文件,但 Rules 面板里没有对应规则。原因:Cityengine 2019.0 对规则包的元数据版本有要求,如果 .CRP 是在更高版本里打包的,低版本读不出入口规则。解决:用文本编辑器打开 .CRP 里的rule.xml(.CRP 本质是 zip,改后缀解压),看version字段。如果高于 2019.0,要么升级软件,要么找对应版本的规则包。另一个原因是规则包没有放在工作空间的rules目录下,Cityengine 不会自动扫描外部路径。
4.2 地块上拖了规则,但只生成一个方块
现象:建筑没有窗户、没有屋顶,就是一个拉伸的盒子。原因:入口规则选错了。规则包里通常有多个入口,比如Building、Block、Lot。如果你把Block规则拖到单个地块上,它只会生成一个体块。解决:在 Inspector 里把Rule File切换成Building或Residential这类单体规则。如果不知道哪个是入口,看规则文件里的@StartRule注解,带这个注解的才是入口。
4.3 生成速度突然变慢,一栋楼要等几十秒
现象:调完参数后,场景里几百栋楼重新生成,卡到无法操作。原因:规则里用了高精度资产或过密的split。比如windowWidth设成 0.3,一栋楼生成上千个窗户单元,每个单元都带独立几何体。解决:把windowWidth调回 1.5 以上,或者在规则里加LOD控制,远景用贴图代替几何。另一个原因是纹理尺寸太大,把 4K 贴图换成 1K,生成速度会明显回升。
4.4 建筑之间互相穿模
现象:相邻地块生成的建筑,阳台或屋顶挑檐插进了隔壁楼里。原因:规则库默认按地块边界生成,没有考虑相邻建筑的实际退线。解决:调大setbackSide和setbackRear,给每栋楼留出缓冲。如果地块本身很小,就在规则里加一个case判断,当area < 200时强制roofType = flat且overhang = 0。我一般会在生成后切到顶视图,用Select > Similar批量检查穿模的楼,再统一调参。
4.5 参数改了但模型没变化
现象:在 Inspector 里改了height或roofType,按了回车,模型纹丝不动。原因:规则里用了const或attr固定值,参数被硬编码覆盖了。解决:打开规则文件,搜索const和attr,把需要暴露的参数改成attr并加上@Range注解。比如attr floorHeight = 3.0改成@Range(2.5, 5.0) attr floorHeight = 3.0,这样 Inspector 里才会出现可调滑块。如果不想改规则,就在规则分配时勾选Override,强制覆盖内部常量。
5. 进阶:把规则库接进批量出图与规划验证流程
5.1 用 Python 脚本批量改参和导出
Cityengine 自带 Python 控制台,可以批量操作规则参数。下面这段脚本是我常用的:遍历场景里所有带规则的地块,按地块面积分组,分别设置不同的floorCount和roofType,然后导出为 .obj。
# 批量调参并导出,适用于 Cityengine 2019.0 from scripting import * ce = CE() # 获取所有带规则的地块 lots = ce.getObjectsFrom(ce.scene, ce.withRuleFile("Building_Residential")) for lot in lots: area = ce.getAttribute(lot, "area") if area < 500: ce.setAttribute(lot, "floorCount", 3) ce.setAttribute(lot, "roofType", "gable") elif area < 1500: ce.setAttribute(lot, "floorCount", 8) ce.setAttribute(lot, "roofType", "flat") else: ce.setAttribute(lot, "floorCount", 18) ce.setAttribute(lot, "roofType", "hip") # 重新生成 ce.generate(lot) # 导出整个场景为 obj ce.export(ce.scene, "D:/CE_Workspace/output/city_block.obj", "OBJ")逻辑说明:ce.getObjectsFrom按规则文件名筛选地块,避免误操作道路或地形。ce.setAttribute直接写参数值,比手动拖滑块快得多。ce.generate触发重新生成,最后统一导出。参数说明:floorCount是整数,roofType是字符串枚举,必须和规则里定义的枚举值完全一致,大小写敏感。如果导出报错,检查输出目录是否存在,Cityengine 不会自动创建文件夹。
5.2 用规则库做日照和视线验证
批量生成之后,我一般会跑两个验证。日照验证:在 Cityengine 里打开Shadow Analysis,设置日期为冬至日,时间从 9:00 到 15:00,看哪些建筑被遮挡超过 2 小时。如果某栋楼不达标,就回去调它的towerHeight或setbackRear。视线验证:用View Corridor工具从主要观景点拉一条视线,看规则库生成的建筑有没有挡住地标。这两个验证不需要额外插件,Cityengine 内置就能跑。
5.3 一个具体技巧:用规则库快速生成“城市肌理”对比方案
做规划方案比选时,最耗时的不是建模,是改一版等一版。我的习惯是:把规则库里的floorHeight、setbackFront、roofType三个参数做成三组预设,分别对应“高强度开发”“中强度开发”“低强度开发”。每组预设存成一个 .cga 规则文件的变体,或者直接用 Python 脚本切换。生成后导出三张顶视图和一张鸟瞰图,放在一起对比。这样一上午能出三版肌理,而不是三天出一版。
从那以后我每次拿到新的 Cityengine 建筑规则库,都强制走一遍“导入 → 最小地块测试 → 参数分组 → 批量生成 → 日照验证”的流程,不再一上来就铺满整个地块。希望帮到你。
本文还有配套的精品资源,点击获取