← 返回作品集贾晔昕 / TECHNICAL NOTES
程序化城市 / 管线实践

程序化管线搭建案例分析

从 OSM 路网出发,记录 Houdini 中道路、地块、建筑与配套资产的生成过程。

HoudiniOSM程序化城市City Sample 拆解实践

为什么重新梳理管线

在反复拆解 City Sample 的 Houdini 工程时,我希望进一步理解输入数据、生成规则与输出结果之间的关系,探索更便于定制的程序化城市搭建流程。

这次实践选择以 OSM 路网数据作为起点:利用其道路分类信息,在整理输入后生成路网、建筑用地与建筑立面,搭建可继续扩展的城市框架。

OSM 数据整理→路网生成→地块细分→建筑与配套

数据准备:让输入可控

选取深圳南山至福田区域的路网。原始数据虽然包含道路层级标签,但在本次使用中出现主辅路重叠、交汇复杂等情况。因此,我以原始路网为参考进行人工重绘与简化,使输入更便于后续规则处理。

OSM 路网数据与区域范围
OSM 路网数据与区域范围

将道路归为主道路、次级道路与小路三类,分别设置对应 6、4、2 车道的道路宽度。高速道路单独处理,为后续匝道与城市道路的衔接预留空间。

使用方形轮廓裁剪路网,将本次测试范围控制在约 3.5 km × 3.5 km。

路网分类、整理与范围裁剪
路网分类、整理与范围裁剪

路网生成:从曲线到道路模型

通过 Sweep 与 Boolean 节点处理道路曲线,生成路网模型。不同层级道路使用各自的宽度设置,同时检查路面 UV 的一致性。

高速道路暂时与城市道路分离,避免在当前阶段引入过多连接关系,后续再处理合并与衔接。

基于曲线生成道路模型
基于曲线生成道路模型

建筑用地:细分与人工筛选

建筑轮廓没有直接沿用 OSM 的建筑 footprint,而是通过 Houdini 的 Lot Subdivision 节点对地块进行向内细分,尽可能利用道路之间的空白区域。

部分地块经人工筛选后单独保留,用于后续制作与玩法相关的重点建筑,使背景生成区域与需要专门设计的区域能够分别处理。

建筑用地细分与轮廓生成
建筑用地细分与轮廓生成

建筑生成:轮廓、高度与立面规则

以多边形外轮廓曲线和预先写入的建筑高度为输入,生成建筑立面。首先需要检查曲线方向与法线,确保生成的立面朝外。

将底商与住宅区域分开制作,并利用 Shape Grammar 对建筑底部与上部应用不同规则,在统一流程中保留功能差异。

建筑轮廓、朝向与生成规则
建筑轮廓、朝向与生成规则

在规则搭建过程中,同时考虑底商与住宅的区别以及不同立面类型的变化,使生成结果具备一定的多样性。

依据外轮廓与高度生成建筑立面
依据外轮廓与高度生成建筑立面

配套填充与城市框架

在道路与建筑之外,继续填充红绿灯、道路标识、路灯等配套资产。此类资产具有明确的朝向要求,需要结合所在道路及摆放位置处理方向。

城市配套资产填充
城市配套资产填充

最终,输入整理后的 OSM 曲线信息,可以生成程序化城市框架。

程序化城市框架生成结果
程序化城市框架生成结果

阶段总结与后续计划

本次实践串联了数据整理、路网建模、建筑用地细分、建筑生成与配套填充。输入端保留人工整理,重点区域保留手工筛选,在自动生成与定制空间之间进行取舍。

后续计划:结合 PDG 流程与 Houdini Engine,将城市框架导入 Unreal Engine 进行实时渲染。该部分在原稿中属于下一阶段工作,不作为已完成成果展示。