ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

模块化建筑资产制作全流程:从规范到白模验证

模块化建筑资产制作全流程:从规范到白模验证 做模块化建筑资产最怕的不是建模慢而是做完一大包零件后拼装时出现缝隙、旋转角度对不上、原点乱飞、文件名看不懂。很多新手上来到“模块化”三个字就直接开建先堆墙、再放窗户最后发现墙和墙无法无缝拼接窗框比例不统一只好把所有资产重做一遍。问题不出在建模技能而出在制作前没有一套可执行的规范。这次我们来看的这套“模块化建筑资产制作全流程”核心思路是先把标准定死再动手建模。只要建模之前完成网格对齐方案、尺度网格、命名规范和工程目录四件事后面无论是做一个三层小楼还是一整片街区都能靠同一批零件快速组合出来。本文是系列教程的上篇重点覆盖前期规划、模块拆分、白模搭建、脚本批处理和工程管理UV、材质、贴图以及引擎整合留在下篇展开。如果你正在做游戏场景、建筑可视化、虚拟展厅或者需要长期维护一份可复用的资产库这篇文章可以直接收藏照着做。1. 模块化建筑资产核心能力速览能力项说明工作流类型模块化模型资产制作适合游戏场景、虚拟拍摄、建筑可视化、数字孪生等适用软件主流 DCC 均可本文示例以 Blender 为主流程同样适配 3ds Max、Maya输出重点可反复组合的墙、柱、窗、门、屋顶、转角、收口等标准零件核心规范网格对齐、支点规则、命名规则、目录规则关键技术白模组合验证、模块拆分、脚本批量处理、LOD 与碰撞体预留扩展能力支持脚本批处理、资产自动重命名、批量导出、持续积累资产库本篇范围规划、拆分、白模、脚本、优化预留下篇范围UV、材质、贴图、引擎整合适合读者场景美术、独立开发者、建筑可视化从业者、数字孪生项目成员硬件要求建模阶段普通办公机即可跑通渲染烘焙阶段需要独立显卡学习成本中需要具备基本建模操作能力不需要写复杂代码要特别说清楚模块化资产不是“把一栋楼拆成一百个零件”就完了。真正的模块化是指同一套零件在严格统一的规则下可以组合出不同的建筑形态而不是每一栋楼都要单独建一套模型。核心资产不是那几栋楼而是那套“能拼出无数楼”的零件库。2. 模块化建筑资产的拆分思路开始建模之前先回答一个问题这批资产到底要拼出什么如果只做一栋固定的样板间那直接整体建模效率更高不需要模块化。只有当你需要多栋楼、多个建筑变体、多种立面风格时模块化才值得投入。模块化建筑的拆分逻辑通常按“结构部位 连接关系”两条线同时走。按结构部位拆分是指把建筑分成墙体、楼板、柱子、屋顶、窗、门、楼梯等类别按连接关系拆分是指每个零件必须能跟相邻零件准确对齐正负公差为零。一个典型的模块拆分方案如下模块类别包含内容说明直段墙不同长度的实墙段、带窗墙段、带门墙段长度必须按基础网格倍数递增转角件90 度外墙转角、135 度转角解决墙与墙直接拼接时的死角收口件墙头、墙脚、窗户上沿、窗户下沿防止两个零件之间出现结构漏洞柱子方柱、圆柱、半柱、装饰柱柱子高度与墙体高度严格一致屋顶平屋顶、坡屋顶、女儿墙、檐口屋顶模块必须与墙顶支点匹配楼板标准楼板、半块楼板、边缘板为多层建筑预留细节件空调外机、管道、阳台、雨棚独立制作不参与主要承重结构模块拆出来后要确认三类关键零件是否齐全直段件、转角件、收口件。很多项目只做了直段墙拼直角时发现墙之间有缝又临时补转角件结果角度不对改来改去。正确做法是在拆分阶段就把转角件、收口件列进资产清单并且在白模阶段验证过再进入细模。拆分时还要考虑模块的“复用频率”。墙体、柱子、楼板这类高频件必须优先做且要和窗户尺寸、门洞尺寸强绑定。比如墙体宽度定了 300 厘米那窗户宽度就要是 150 厘米或 300 厘米保证一块带窗墙段可以直接替换一块实心墙段而不改变整体网格对齐。3. 制作前必须定死的四套标准模块化资产失败绝大多数不是败在模型质量而是败在标准不统一。制作之前一定要先把下面四套标准写进项目文档并且让团队所有人都照着执行。3.1 网格对齐与支点网格对齐是模块化资产的第一生命线。推荐的做法是让所有零件都落在同一个基础网格上。常见网格单位是 50、100、150、200按项目实际尺度选一个作为基准。举例建筑模块基础网格使用 100 厘米那墙的长度只能是 100、200、300、400 这样的整数倍不允许出现 267、333 这种奇数值。零件支点也有硬性规定。一个零件的原点和坐标方向决定它在场景里摆放时的吸附行为。常用规则有两种中心支点适合柱子、对称件放下来永远居中。底边支点适合墙体、门、窗保证贴地时底部对齐。实际操作中更稳健的方案是让支点方向统一为“左下角 贴底”。也就是说每个零件原点都在包围盒的左下角、底部平面这样放进 DCC 或游戏引擎里只需要用网格吸附就能摆齐不需要人眼微调。支点规则一旦定好整个项目不能随意改否则组合结果就会全部偏移。3.2 尺度与模块化比例尺度标准包含两部分世界尺度和模块步长。世界尺度要写进项目规范例如 1 单位 1 厘米还是 1 米。不同的 DCC 和游戏引擎对单位支持不一样但项目内部必须统一。推荐在建模软件里直接设置单位为米避免后期导入引擎时出现 100 倍缩放问题。模块步长决定建筑部件的“最小公共尺寸”。所有平面尺寸都必须是步长的整数倍。如果步长是 50 厘米那墙体可以是 50、100、150、200但地板宽度不能是 175。这样做的目的是保证不同类零件可以互相替换。举例一堵墙的长度是 400那它能匹配的地板也必须是 400 的整数倍逻辑不能出现墙 400、地板 375 还要硬拼的情况。3.3 命名规范命名规范的目的是让任何人拿到一个模型文件不用打开就知道它属于哪个部位、多长、是直段还是转角、支点类型是什么。推荐格式如下MOD_类别_尺寸_变体_版本字段含义示例MOD模块化资产前缀统一为 MOD类别结构部位Wall、Floor、Roof、Column尺寸关键长度或宽度400x300变体用途或外观Window、Door、Plain版本资产版本V01举个例子一堵 400 厘米长、300 厘米高、带窗的墙可以命名为MOD_Wall_400x300_Window_V01命名规则要覆盖物体名、模型文件名、导出文件名。不要出现模型文件叫 Wall_01里面物体叫 Cube.007 这样的混乱情况否则后期批量处理脚本根本没法工作。3.4 文件目录与版本管理工程目录建议用下面的结构project_root/ ├── assets/ │ ├── modules/ │ │ ├── wall/ │ │ ├── floor/ │ │ ├── roof/ │ │ ├── column/ │ │ └── corner/ │ ├── references/ │ ├── previews/ │ └── export/ ├── scenes/ ├── scripts/ └── docs/assets/modules 按零件类别建子目录references 放参考图export 放最终导出文件scenes 放组合好的整楼验证场景scripts 放批处理脚本docs 放项目规范文档。这种结构在项目刚开始的时候看起来有点重但资产数量超过 100 个之后优势会非常明显。版本管理优先用 Git LFS 管理工程文件和模型文件。每个资产进入新版本时记得在 docs 里更新一次变更记录写明改了什么、为什么改。这个过程听起来繁琐但对需要长期维护的资产库来说能省掉大量重复沟通成本。4. 软件与工程环境准备模块化建筑资产对软件没有硬性唯一要求。Blender、3ds Max、Maya 都能做差异只是操作习惯和插件生态。本文以 Blender 为例因为它的 Python 接口成熟方便写脚本做批量处理而且对于独立开发者和个人资产整理场景来说零授权成本。4.1 建模软件基本设置新建项目时先做以下几件事设置单位为米并确认导入导出时的缩放保持一致。开启网格吸附吸附模式选择“增量”增量步长填基础网格数值。设置旋转吸附角度建议 15 度或 90 度旋转角度固定后转角件不容易出现 89.9 度的误差。开启对齐到世界坐标系保证所有零件坐标轴方向一致。视口性能模式调到合适状态白模测试阶段不开材质直接使用平直着色观察轮廓。这些设置看起来基础但直接决定了白模组合时是否会出现肉眼不可见的微小偏差。实际项目中很多模块拼不上就是旋转角度吸附没有开启两个墙段之间差了 0.1 度放大后出现一道细缝。4.2 需要用的插件与辅助工具常用辅助能力包括批量重命名、批量设置原点、自动展 UV、网格检查、导出批处理。Blender 自带大量相关功能不需要额外付费插件。例如原生的 Batch Operations 脚本、UV 编辑工具、面数统计面板已经足够。如果要从 Blender 导出到 Unreal Engine需要先在 Blender 里安装对应引擎插件并严格按照引擎的项目设置调整模型轴、单位、变换应用和命名前缀。4.3 性能与面数预算白模阶段通常不需要过度担心面数但建议每个零件在正式制作前先定一个面数预算。预算不是拍脑袋出来的而是根据项目目标平台估算的。举例如果目标是移动端实时渲染单栋建筑所有模块总三角面数应控制在 5 万到 15 万具体数值取决于同屏建筑数量和设备性能。如果目标是 PC 端大场景单栋建筑可以放到 20 万到 50 万。定好预算后把预算拆分到墙体、屋顶、柱子、细节件并在每个资产文件里用文本备注记录制作时每完成一个零件就检查一次。5. 白模搭建与组合验证模块化资产最容易翻车的地方是在白模阶段没有做组合验证。很多作者直接做出高模导到引擎里才发现两块墙咬不上、窗框对不齐、转角件多出 2 毫米返工成本极高。正确顺序是先搭白模验证组合逻辑再补细节。5.1 先做标准件标准件就是整个资产库中尺寸最基础、被引用最多的零件。通常选择一面完整墙段作为标准件长度等于基础网格的最小整数倍例如 200 厘米长、300 厘米高、厚度 24 厘米。这面墙做出后立刻复制几份测试以下组合场景两段墙水平拼接长边无缝且高度一致。三段墙排成一排接缝处没有重叠面。墙段放倒后左右旋转 90 度搭成 L 形转角处不出现缺口。墙体叠放两层高度方向严格对齐。每通过一个测试就在文档里打一个勾。白模组合测试全部通过后再做窗、门、转角这些变体件。变体件必须和标准件复用同一套尺寸参数不允许单独调一个数值。举例标准墙是 200 厘米长那带门的墙段也必须控制在 200 厘米的整数倍范围里门洞宽度要配合 200 厘米这个模数而不是随意设定。5.2 锁定支点与吸附方式白模阶段就要把所有零件的原点定好。推荐使用“包围盒左下角 贴底”的规则操作时在 Blender 里选中物体后调用物体菜单的原点设置选择“原点到几何体 - 边界框”然后手动把原点移到包围盒左下角底面。如果零件数量多可以用脚本批量完成后面单独讲。原点定好之后还要检查每块模型的三角面方向。模型面朝向必须统一指向外否则拼装后在引擎里会出现一面黑一面亮的异常。Blender 的网格检查工具可以直接高亮翻转面执行一次全场景检查。5.3 循环拼接与多面连接模块化建筑的地面布局通常不是一道直线而是由多个直段、转角、收口组成封闭轮廓。白模阶段建议按如下流程验证用直段墙拼一个 6 米乘 4 米的矩形平面。在矩形四角放上转角件观察转角件与墙体的重叠情况。把墙体整体复制一层作为二层墙体测试高度方向的对齐。加入楼板确认楼板边缘和墙体内侧没有互相穿刺。再加一层测试三层建筑的整体稳定性。这个验证场景不要一次性做完整栋楼而是做一个“最小封闭单元”比如一个两层小楼或一个转角房间。最小封闭单元测试通过说明模块连接逻辑成立再去做大范围外立面拓展才有意义。这个最小封闭单元也可以作为资产库里的标准验收场景后续每增加一个新模块都放进这个场景里跑一遍避免新增零件破坏已有组合。5.4 转角与收口转角件和收口件是模块化资产里最容易做坏的部分。转角件出现的问题通常是角度偏差 0.1 度、长度不匹配、上下层衔接出现破面。收口件的问题则是对位不准导致墙顶与屋顶之间出现细缝。推荐在白模阶段就做一批通用转角件90 度外转角、90 度内转角、T 形连接件、十字连接件。很多项目只做了外转角遇到 T 形墙段连接时只能用两段硬拼结果内部结构外露。提前把连接件做全能节省大量后期修模时间。6. 用脚本批量处理命名、原点与文件模块化资产数量一多手动改命名和原点就是灾难。下面给出几个 Blender Python 脚本示例用于批量设置原点、批量重命名和自动整理文件。脚本整体是通用模板实际运行前要按你的 Blender 版本和项目命名规则调整。6.1 批量设置原点到包围盒左下角底部import bpy from mathutils import Vector def set_origin_to_bottom_left(obj): bpy.ops.object.select_all(actionDESELECT) bpy.context.view_layer.objects.active obj obj.select_set(True) bpy.ops.object.origin_set(typeORIGIN_GEOMETRY, centerBOUNDS) # 取包围盒世界坐标 world_corners [obj.matrix_world Vector(c) for c in obj.bound_box] min_x min(v.x for v in world_corners) min_y min(v.y for v in world_corners) min_z min(v.z for v in world_corners) center_z (max(v.z for v in world_corners) min_z) / 2 # 把原点平移到左下角底部再还原物体世界位置 local_offset obj.matrix_world.inverted() Vector((min_x, min_y, min_z)) obj.location local_offset for obj in bpy.data.objects: if obj.type MESH: set_origin_to_bottom_left(obj) bpy.context.view_layer.update()这段脚本会遍历当前 Blender 文件里所有网格物体把原点设置到包围盒左下角底部。执行前请先保存文件副本因为脚本会直接修改物体位置。6.2 批量重命名import bpy prefix MOD_Wall for obj in bpy.data.objects: if obj.type MESH: obj.name f{prefix}_{obj.name} if obj.data.name.startswith(Mesh): obj.data.name obj.name print(重命名完成)实际使用中建议根据模型内容手动维护一个对照表避免把所有墙都叫成墙、把所有柱子都叫成柱导致后续无法区分尺寸。更稳妥的流程是先在 Blender 里给物体打上自定义属性例如写入 length、width、variant 三个字段再根据属性批量生成标准名。6.3 创建标准目录结构mkdir -p assets/modules/{wall,floor,roof,column,corner} mkdir -p assets/references assets/previews assets/export mkdir -p scenes scripts docs6.4 批量导出到独立文件夹如果使用通用格式例如 FBX 或 glTF可以先按类别建好导出目录再在 DCC 中选中同类别物体导出。Blender 可以执行批处理导出但不同版本的导入导出设置不同这里只给一个参考模板# FBX 导出前确认单位、轴、变换是否统一 # 首选在 DCC 内手动检查导出配置再跑批处理脚本脚本的优势是“可重复执行”。如果你把命名规则、原点规则写进脚本后续新增资产时只需要按同一规则建模跑一次脚本就能让所有零件符合工程要求。这才是模块化资产库长期维护的关键。7. 资产优化与性能预留模块化资产制作不能只考虑“能不能拼”还要考虑“拼完能不能跑”。设计阶段就要为后续优化留出位置。7.1 面数控制与减面白模阶段可以直接用 Blocking 方式搭建也就是用最简单的长方体、圆柱体搭出基本轮廓不开细分。组合验证通过后再按资产预算做正式拓扑。正式模型尽量使用四边形面不建议留大量三角面除非导出的引擎对三角面没有要求。做曲面造型时减少不必要的分段数一个圆柱体 8 到 12 段就能满足多数建筑需求不需要 32 段。7.2 LOD 层级预留LOD 是游戏场景中常见的性能优化手段。模块化资产在做正式模型时应该同步做 LOD 规划而不是等引擎里发现卡顿再回来减面。简单做法是LOD0 保持原始精模LOD1 删除小细节件LOD2 使用简化几何体LOD3 用包围盒或极低模。每个模块在导出时按 LOD 等级分别导出命名后缀加 LOD0、LOD1、LOD2。不同 LOD 之间的距离切换值建议在引擎里配置不固定写死。7.3 碰撞体预留如果是游戏资产大部分引擎会自动生成简单盒体碰撞但建筑模块的碰撞仍然建议手动预留。墙体和地板可以直接用盒体碰撞楼梯和坡道需要凸包碰撞或自定义模型碰撞。碰撞体的复杂程度不要超过模型本身否则碰撞计算开销会比渲染开销还大。7.4 材质与纹理集规划下篇会详细讲 UV 和材质但这里先提一个思路模块化资产的材质不要一张贴图管所有零件而是按材质集拆分。常见做法是做一个共享的“建筑纹理集”把常用表面类型集中到一张图集里包括砖墙、混凝土、金属窗格、檐口、玻璃另留一张独立的细节贴图集用于空调外机、管道、栏杆等小构件。图集能大幅减少材质切换和绘制调用对引擎渲染性能很有帮助。8. 常见问题与排查方法问题现象可能原因排查方式解决方案两块墙拼接后有细缝网格对齐标准不统一或旋转吸附未开启检查两块墙的世界坐标是否落在同一网格上统一基础网格步长开启增量吸附重新摆放转角件对接不上转角件尺寸不是基础网格整数倍查看转角件包围盒尺寸重新按基础网格制作转角件模型拼接后有重叠面两个零件之间的距离等于 0 或小于 0在透视视图检查墙体内侧统一模块厚度和中心支点规则导出到引擎后场景放大 100 倍DCC 与引擎单位不一致检查导入设置和单位选项统一使用米作为项目单位导出时覆盖缩放墙段高度方向对不齐原点没贴底查看原点坐标和高度执行批量设置原点脚本模型表面出现暗面法线方向不一致开启面朝向检查统一法线方向翻转反法线材质丢失或纹理模糊UV 没有展好或贴图分辨率不足检查 UV 编辑器中的展开结果重展 UV控制纹素密度资产库越来越乱目录和命名规则没有严格执行检查最近新增文件重命名并移动到规范目录白模阶段遇到的问题多半是规范问题而不是建模技巧问题。遇到新问题优先回到规范文档里找原因不要直接动手改模型。9. 工程化实践与合规边界模块化资产库做到后面真正决定效率的是维护方式。以下几点是长期项目里比较实用的实践每个资产单独存一个 Blender 文件文件内只放一个零件及其变体避免一个文件里堆几十个物体。白模验收场景单独存一个文件新增模块必须在这个场景里做一次组合测试。每个模块配套一张预览图方便在资产缩略图里快速识别。预览图可以直接渲一张白模透视图。导出使用统一格式。UE 项目用 FBXWeb 项目优先 glTFBlender 原生文件只作为工程源文件。版本记录写在 docs/CHANGELOG.md 里每次改动只写关键变更不写流水账。合规方面需要注意模块化建筑资产经常涉及参考图收集和素材复用。参考图只用于观察比例和造型不要直接导入模型使用如果参考图包含受版权保护的建筑外观、雕塑、品牌标识更要避免原样复制。使用第三方模型库时要确认授权范围特别是商业项目不能认为下载了就能任意修改和商用。涉及真实建筑外观、真实街道景观时建议只用原创设计或已确认可商用的素材。10. 总结与下篇预告模块化建筑资产的制作其实不是单个模型制作问题而是一套标准化工程流程。本篇我们把前期规划、模块拆分、网格对齐、命名规范、目录管理、白模组合验证和脚本批处理全部走了一遍。只要按这套流程执行即使最终成品只有一百个零件也能拼出几十种不同平面布局的建筑而不是做一栋就建一栋。最值得先验证的是白模组合用三面墙加一个转角件拼一个 L 形平面再叠成两层看看接缝、高度、转角是否全部通过。最容易踩的坑是原点不统一和命名不规范这两个问题越到后期越致命。建议在动工前把规范文档写好再开始建模。下篇会继续讲 UV 展开、纹理集规划、材质制作以及如何把整套模块资产导入 Unreal Engine 或 Unity 进行组合测试和 LOD 配置。如果你正在准备自己的模块化资产库先把上篇的白模验证跑通下篇再补材质和渲染。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进