ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CityEngine古建筑规则库实战:从CGA参数到三维古城批量生成

CityEngine古建筑规则库实战:从CGA参数到三维古城批量生成 简介这份资源是面向CityEngine用户与古建筑三维建模学习者的规则库合集重点解决传统风格建筑在参数化建模中形态复杂、贴图粗糙、重复劳动多的问题。包内共2000个文件以971个js脚本、1007张jpg贴图、109张png素材和35个cga规则文件为核心辅以obj、mtl、cgb等模型与材质文件以及少量工程配置与说明文档压缩包约209.88MB可直接导入CityEngine拖拽使用。资源围绕规则引擎展开涵盖飞檐翘角、斗拱、浮雕等古建特征的参数化实现并配有高分辨率木纹、砖石与彩绘纹理便于快速搭建明清风格或历史街区场景。目前已有1293人学习下载适合城市规划、文化遗产保护方向的中级建模者参考复用能显著减少从零编写规则的工作量。1. 从一堆散乱照片到可编辑的三维古城CityEngine 古建筑规则到底能干什么手里有一批古建筑测绘照片、CAD 线稿或者点云切片想快速生成带屋顶举折、斗拱层次、台基收分的三维模型靠手工在 SketchUp 或 3ds Max 里一根根拉构件一栋两层小殿就能耗掉一周。CityEngine 的古建筑规则库解决的正是这个场景把「台基—柱网—墙体—屋顶—脊饰」这套木构逻辑写成 CGA 规则输入底面轮廓和层高参数程序自动挤出带细节的建筑体改一个参数整条街的形制跟着变。它适合做历史街区保护规划、文旅场景批量建模、游戏与影视的前期白模也适合建筑遗产课程里做形制推演。规则库不是万能生成器它更像一套「形制模板」你得先理解古建的模数关系才能把参数调对。下面按「规则怎么读—参数怎么设—坑在哪—怎么验」的顺序拆一遍。2. 拆开规则库CGA 文件结构与古建形制的对应关系2.1 规则文件里到底写了什么CityEngine 的规则以.cga为后缀本质是带属性的过程式建模脚本。古建筑规则库通常按构件拆成多个文件常见组织方式是主规则ancient_building.cga调用roof.cga、column.cga、base.cga等子规则。主规则负责读取地块轮廓、判断建筑类型殿堂、楼阁、民居再把不同构件规则按层级挂上去。一个典型的规则入口长这样// ancient_building.cga // 入口根据 attr 判断建筑形制分发到不同构件规则 attr buildingType hall // hall殿堂, tower楼阁, house民居 attr floors 1 // 层数 attr bayCount 5 // 开间数 attr bayWidth 3.6 // 单开间面阔米 attr depth 12.0 // 进深米 attr eaveHeight 4.2 // 檐口高度米 attr roofType xieshan // 屋顶类型wudian/xieshan/yingshan Lot -- case buildingType hall: Hall case buildingType tower: Tower else: House Hall -- split(y){ ~1 : Base | ~eaveHeight : Body | ~1 : Roof } Base -- // 台基按面阔和进深外扩带收分 offset(-0.8) extrude(0.6) comp(f){ top : BaseTop | side : BaseSide } Body -- // 柱网与墙体按开间数切分 split(x){ ~bayWidth : Bay }*这段规则的核心逻辑是「先分层、再分间」。split(y)把建筑沿高度切成台基、屋身、屋顶三段split(x)再按开间宽度把屋身切成若干柱距。参数bayCount和bayWidth直接决定面阔eaveHeight决定檐口高度roofType决定调用哪套屋顶规则。改bayCount从 5 到 7整栋建筑的柱网和屋顶举架会同步变化这是手工建模做不到的。2.2 屋顶规则是形制的核心古建筑最难的是屋顶。庑殿、歇山、悬山、攒尖的差别不只是外形还有举折曲线、翼角起翘、正脊与垂脊的交接。规则库里通常用roof.cga单独处理常见做法是用roofHip、roofShed等内置操作做基础体再用comp和offset叠加脊饰。// roof.cga // 歇山屋顶先做庑殿基础再切出山花 attr roofHeight 3.5 attr overhang 1.2 // 出檐 attr ridgeHeight 0.4 // 正脊高 attr upturn 0.6 // 翼角起翘 Roof -- case roofType xieshan: Xieshan case roofType wudian: Wudian else: Yingshan Xieshan -- // 出檐后做庑殿顶 offset(-overhang) roofHip(roofHeight) // 切出山花面 comp(f){ side : XieshanSide top : Ridge } Ridge -- // 正脊沿屋脊方向挤出 split(y){ ~ridgeHeight : RidgeBody } RidgeBody color(0.35, 0.12, 0.10) // 琉璃瓦色offset(-overhang)控制出檐深度roofHip生成四坡顶comp(f)把屋顶面拆成侧面和顶面侧面做山花顶面做正脊。upturn参数在完整规则库里会驱动翼角起翘的曲线通常用spline或分段extrude配合rotate实现。这里要注意CityEngine 内置的roofHip生成的是直线坡古建的举折是凹曲线规则库里一般会用多段折线逼近段数越多越平滑但面数也越高。2.3 参数表哪些值必须按测绘数据填规则库的参数不是随便填的古建有固定的模数关系。常见做法是先把测绘得到的「面阔、进深、柱高、举高」换算成规则参数再批量赋值。参数名含义典型取值依据bayCount开间数3/5/7/9明间面阔最大次间递减bayWidth单开间面阔3.04.5 m清代以「斗口」为模数depth进深815 m通常为面阔的 1.52 倍eaveHeight檐口高3.55.5 m柱高加斗拱层roofHeight屋顶举高檐口高的 0.60.8举架逐层加陡overhang出檐0.81.5 m与柱高比例约 1:4upturn翼角起翘0.30.8 m南方建筑起翘更大这张表是规则库能不能「像」的关键。我见过有人把bayWidth统一设成 4 米结果七开间大殿面阔 28 米比例完全失真。正确做法是按「明间最宽、次间递减、梢间最窄」的规律分别赋值规则库里如果支持数组参数就用attr bayWidths [4.2, 3.8, 3.4, 3.0]这种方式逐间控制。3. 从轮廓到模型一次完整的古建筑生成流程3.1 准备底面轮廓与属性表CityEngine 生成建筑的前提是地块或轮廓。古建筑通常没有现成地块需要先导入 CAD 线稿或手绘轮廓。常见做法是在 ArcGIS 或 QGIS 里把测绘底图配准导出为.shp或.dxf再导入 CityEngine。导入后给每个轮廓挂属性。属性表可以用 CSV 批量赋值id,buildingType,floors,bayCount,bayWidth,depth,eaveHeight,roofType A01,hall,1,5,3.8,12.0,4.2,xieshan A02,hall,1,7,4.0,15.0,4.8,wudian A03,tower,2,3,3.2,8.0,3.6,yingshan A04,house,1,3,3.0,7.0,3.0,yingshan在 CityEngine 里用File Import CSV把属性表关联到轮廓的id字段。关联后每个轮廓就带上了buildingType、bayCount等属性规则运行时直接读取。3.2 挂规则并生成把ancient_building.cga赋给轮廓图层CityEngine 会自动为每个轮廓生成模型。如果属性表字段名和规则里的attr名一致属性会自动映射不一致时需要在规则里用attr显式声明并做映射。// 属性映射CSV 字段名与规则 attr 对应 attr buildingType hall attr bayCount 5 attr bayWidth 3.8 // ... 其余 attr 同上 Lot -- // 读取轮廓后直接调用主规则 AncientBuilding生成后如果发现模型朝向不对通常是轮廓的起始边方向问题。CityEngine 默认以轮廓第一条边为正面古建筑讲究坐北朝南需要在导入前把轮廓的起始边调整到南侧或者在规则里加rotate校正。3.3 批量调整与导出生成完一版后最常做的是批量调参。CityEngine 支持在 Inspector 面板里选中多个对象统一改属性也支持用 Python 脚本批量操作# CityEngine Python 控制台批量修改屋顶类型 from scripting import * ce CE() # 获取当前场景所有建筑对象 buildings ce.getObjectsFrom(ce.scene, ce.withName(A*)) for b in buildings: # 读取当前属性 bt ce.getAttribute(b, buildingType) if bt hall: # 殿堂统一改为歇山 ce.setAttribute(b, roofType, xieshan) ce.setAttribute(b, overhang, 1.2) ce.saveScene()这段脚本遍历场景里所有名字以 A 开头的对象把殿堂的屋顶统一改成歇山并调整出檐。ce.getObjectsFrom支持按名称、图层、类型筛选ce.setAttribute直接改属性并触发规则重算。批量操作前建议先保存场景规则重算在复杂模型上可能耗时。导出时按用途选格式做规划分析导.obj或.fbx做 GIS 分析导.shp加高度字段做渲染导.fbx保留材质。古建筑规则库生成的模型面数通常较高导出前可以用cleanup或reduce减面但要注意别把斗拱细节减没了。4. 避坑与排查古建筑规则最容易翻车的五个地方4.1 屋顶举折变成直线坡现象生成的屋顶从侧面看是直的没有古建那种「上陡下缓」的凹曲线。原因规则库里用的是roofHip或roofShed内置操作这些操作生成的是直线坡。古建的举折需要多段折线逼近如果规则里没有实现分段逻辑就会是直线。解决检查roof.cga里是否有split(y)分段加rotate的逻辑。常见做法是把屋顶沿进深方向切成 57 段每段坡度递增用extrude加rotate逐段生成。如果规则库没带这个功能需要自己补一段循环。4.2 翼角起翘方向反了现象屋顶四角的起翘朝内而不是朝外或者起翘量过大导致模型穿插。原因翼角起翘依赖屋顶面的法线方向如果轮廓的起始边方向反了或者upturn参数符号写反起翘就会朝内。解决先检查轮廓方向确保正面朝南。再检查upturn的正负号通常正值表示向上向外。如果还是不对在规则里加reverseNormals或调整comp的面选择。4.3 斗拱层导致模型面数爆炸现象一栋小殿生成几十万面整条街直接卡死。原因斗拱规则如果每个斗、每根拱都单独建模面数会指数级增长。规则库里常见做法是用简化几何代替精细斗拱但如果参数设得太细还是会爆。解决在规则里加 LOD细节层次控制。近景用精细斗拱中景用简化块远景直接省略。CityEngine 支持lod属性可以在规则里按距离切换attr lod 2 // 0精细, 1中等, 2简化 Dougong -- case lod 0: DetailedDougong case lod 1: SimpleDougong else: color(0.4, 0.3, 0.2) s(1, 0.5, 1) primitiveCube()4.4 属性表字段名不匹配导致参数失效现象CSV 里明明写了bayCount7生成出来还是默认的 5 开间。原因CSV 字段名和规则里的attr名大小写不一致或者 CityEngine 导入时没有正确关联字段。解决检查 CSV 表头和规则attr声明是否完全一致包括大小写。CityEngine 对字段名大小写敏感。导入后在 Inspector 里选中一个对象看属性面板里bayCount是否显示了 CSV 里的值如果显示默认值说明映射失败。4.5 导出后材质丢失现象CityEngine 里看有琉璃瓦颜色导出.obj后变成灰白。原因.obj格式对材质支持有限CityEngine 的color操作生成的是顶点色或材质索引.obj不一定能完整保留。解决需要保留材质时导出.fbx或.dae这两种格式对材质支持更好。如果必须用.obj在导出设置里勾选「导出材质」并附带.mtl文件。另外 CityEngine 的color是 RGB 值不是贴图导出后需要在渲染软件里重新赋材质。5. 进阶技巧用规则库做形制推演与批量验证规则库真正值钱的地方不是「生成一栋楼」而是「批量推演形制变化」。我一般会拿它做两件事一是验证测绘数据的合理性二是做历史街区的高度和风貌控制。先说形制推演。古建的参数之间有模数约束比如面阔和柱高有比例关系举高和进深有比例关系。规则库把这些关系写成attr之间的表达式后改一个参数就能看整栋建筑的变化。常见做法是在规则里加约束// 形制约束举高随进深自动调整 attr depth 12.0 attr roofHeight depth * 0.28 // 举高约为进深的 0.28 // 面阔与柱高比例约束 attr eaveHeight bayWidth * 1.1这样改depth时roofHeight自动跟着变不用手动算。做形制推演时我会把同一栋建筑的不同参数组合生成多个版本并排对比看哪个更符合测绘照片。这一步能发现测绘数据里的矛盾比如面阔和进深比例明显偏离常规形制可能是测量误差。再说批量验证。历史街区保护规划里常要控制建筑高度和屋顶形式规则库可以快速生成不同方案的三维场景用于视线分析和风貌评估。具体做法是把街区轮廓全部导入按保护等级赋不同参数生成后导出到 GIS 做高度统计或者导入渲染软件做视线模拟。验证规则库生成结果是否靠谱我通常走三步第一步拿一栋有详细测绘数据的建筑做单栋对比把生成模型的立面投影和测绘线稿叠在一起看比例是否吻合第二步检查关键形制特征比如屋顶举折曲线、翼角起翘、斗拱层高这些是古建的「指纹」第三步批量生成后抽查看有没有参数异常导致的畸形模型比如屋顶穿插、台基悬空。最后说一个具体技巧规则库的attr可以设范围而不是固定值配合 CityEngine 的随机函数做微差。古建筑群里的建筑不会完全一样开间、进深、屋顶高度都有小幅波动。用rand()在合理范围内加扰动生成出来的街区更自然// 在基准值上做 ±5% 的随机扰动 attr bayWidth 3.8 attr bayWidthJitter bayWidth * (0.95 rand(0.1)) Lot -- // 使用扰动后的值 set(bayWidth, bayWidthJitter) AncientBuildingrand(0.1)生成 00.1 的随机数0.95 rand(0.1)得到 0.951.05 的系数乘上基准值就是 ±5% 的波动。这个幅度对古建来说比较自然再大就失真了。从那以后我每次拿到新的古建筑规则库都强制先拿一栋有测绘数据的建筑跑单栋对比比例不对就先调参数绝不直接批量生成。规则库是工具形制逻辑才是底子参数调不对生成再多也是白搭。希望帮到你。本文还有配套的精品资源点击获取
返回列表