首页 / 资讯中心 / 文章详情

UE5 Modeling Mode与Geometry Script:动态网格编辑实战指南

UE5 Modeling Mode与Geometry Script:动态网格编辑实战指南 ★ FEATURED ARTICLE
1. 从“37”这个编号说起Modeling Mode 到底解决了什么痛点如果你在 UE5 里做过一段时间场景或道具大概率经历过这样的循环在外部 DCC 软件里建好模型导出 FBX导入引擎发现比例不对回 DCC 改再导出再导入。一个简单的墙面造型调整来回折腾半小时。UE5 的 Modeling Mode 就是冲着这个痛点来的——它把一整套网格编辑工具直接塞进了引擎编辑器里让你在关卡里就能完成建模、雕刻、布尔、重构、UV 调整这些操作。标题里的“37”是这套工具集在某个学习体系里的编号但真正值得聊的是后面三个关键词Modeling Mode 工具集、动态网格编辑、Geometry Script 联动。这三者构成了 UE5 内置建模能力的完整拼图。Modeling Mode 是操作界面和工具入口动态网格编辑是底层数据结构支撑Geometry Script 则是把建模能力脚本化、程序化的桥梁。我第一次认真用 Modeling Mode 是在做一个室内场景的时候。当时需要大量不同尺寸的墙板和地板拼接如果用传统流程每个尺寸都要单独建模。后来发现 Modeling Mode 里的PolyExtrude和PolyEdit配合使用可以直接在引擎里拉伸、切割、调整面片效率提升非常明显。更关键的是这些操作是非破坏性的——你可以随时回到之前的步骤调整参数而不是像传统建模那样一旦确认就难以回溯。这套工具适合谁如果你是从美术转过来的有基本的建模概念那上手会很快如果你是纯蓝图或程序向的开发者Geometry Script 那部分会让你如鱼得水如果你完全没接触过建模建议先花点时间理解网格的基本构成——顶点、边、面、UV 这些概念不然后面操作起来会有点懵。提示Modeling Mode 的工具虽然强大但它不是要替代 Blender 或 Maya。它的定位是“引擎内的快速迭代工具”适合做原型、做调整、做程序化生成精细的角色建模还是得靠专业 DCC 软件。2. Modeling Mode 工具集全解析从面板到核心工具2.1 如何进入 Modeling Mode 与界面布局逻辑进入 Modeling Mode 的方式很简单在编辑器左上角的模式下拉菜单里选择Modeling或者用快捷键Shift 5。切换过去之后你会看到左侧出现一竖排工具图标右侧是属性面板视口里多了一些辅助显示元素。这个界面布局的设计逻辑是“工具分类 即选即用”。左侧工具栏按功能分成了几个大类创建Create、多边形编辑Poly、变形Deform、变换Transform、网格操作Mesh、体素Voxel、属性Attribute、UV、烘焙Bake等。每个大类下面有若干具体工具鼠标悬停会显示工具名称和简短说明。我刚开始用的时候觉得工具太多不知道从哪下手。后来总结了一个思路先明确你要做什么再找对应的工具类别。比如你要给一个面做挤出那就是 Poly 类里的PolyExtrude你要把两个模型合并成一个那就是 Mesh 类里的MeshBoolean你要给模型重新生成一套均匀的三角面那就是 Remesh 类里的Remesh。右侧属性面板会随着你选择的工具动态变化。这里有个细节值得注意很多工具都有“实时预览”开关你调整参数的时候视口里会立刻显示效果但只有点击Accept之后才会真正应用到网格上。这个设计避免了误操作但也意味着如果你调了半天参数没点 Accept切到别的工具就白调了。2.2 核心工具分类与高频工具推荐在众多工具里有几个是我日常使用频率最高的这里重点说一下。PolyExtrude多边形挤出这是做建筑类模型最常用的工具。选中一个或多个面调用 PolyExtrude可以沿法线方向挤出新的几何体。参数里有Distance挤出距离、Direction方向模式可选法线方向或指定向量、UV Scale挤出面的 UV 缩放。我通常会把Direction设为Face Normal这样挤出方向自动跟随面的朝向做斜面墙体的时候特别方便。MeshBoolean网格布尔布尔运算在 UE5 里终于变得可用了。支持并集Union、差集Difference、交集Intersection三种模式。做门窗洞口、做复杂造型的切割布尔是最快的方式。但要注意布尔运算对网格质量有要求如果两个网格的面片重叠严重或者有非流形边结果可能会出问题。我的经验是布尔之前先用Remesh把两个网格都处理一遍让面片分布均匀一些成功率会高很多。Remesh重构网格这个工具可以把高模或扫描模型重新拓扑成均匀的三角面网格。参数里的Target Edge Length控制目标边长数值越小面数越多、细节保留越好。做 Nanite 资产的时候Remesh 是预处理的标准步骤。我一般会把 Target Edge Length 设为模型包围盒最长边的 1/100 到 1/200 之间具体看细节需求。PolyEdit多边形编辑这是最灵活的工具可以手动移动、旋转、缩放顶点和边。配合Shift可以多选配合Ctrl可以加选。做微调的时候比用 Transform 工具更精确因为你可以直接操作具体的顶点。UV 工具组包括UVEditor、AutoUV、UVProject等。AutoUV 适合快速给一个模型展 UV虽然质量不如手动展但做原型够用了。UVProject 可以把 UV 按平面、柱面、球面投影做建筑墙面的时候用平面投影最省事。工具名称所属分类典型用途关键参数PolyExtrudePoly墙体挤出、结构延伸Distance、DirectionMeshBooleanMesh开洞、合并、切割Operation、Transfer MaterialsRemeshMesh拓扑重构、Nanite 预处理Target Edge LengthPolyEditPoly顶点级微调选择模式、TransformAutoUVUV快速展 UVTexture ResolutionDisplaceDeform表面起伏、地形细节Texture、Magnitude2.3 工具使用中的常见误区与注意事项第一个误区是在错误的网格类型上使用工具。UE5 的网格分静态网格Static Mesh和动态网格Dynamic Mesh。Modeling Mode 的大部分工具操作的是动态网格如果你直接对一个静态网格资产使用系统会先把它转换成动态网格操作完再转回去。这个转换过程可能会丢失一些信息比如 LOD 设置、碰撞体等。所以我的建议是先在动态网格上完成所有编辑最后再统一烘焙成静态网格。第二个误区是忽视面数控制。Modeling Mode 的工具用起来很爽但很容易把面数堆上去。一个简单的挤出操作可能就增加几百个面做几十次之后模型就变得很重。我习惯在每次大的编辑操作之后用Stats命令看一下当前的面数如果超过预期就及时用 Remesh 或 Decimate 减面。第三个误区是不保存中间状态。Modeling Mode 的操作虽然可以撤销但撤销栈是有限的。做复杂编辑的时候我建议每隔几个关键步骤就用Create Static Mesh把当前状态保存成一个新资产这样即使后面搞砸了也能从上一个保存点重新开始。注意Modeling Mode 里的很多工具在Accept之前不会修改原始网格但有些工具比如 PolyEdit 的拖拽是实时修改的。操作前最好确认一下工具的行为模式避免误操作。3. 动态网格编辑的底层逻辑与实操要点3.1 动态网格与静态网格的本质区别要理解动态网格编辑得先搞清楚它和静态网格的区别。静态网格是“死”的——顶点位置、索引缓冲、UV 数据在导入时就固定了运行时不能改。动态网格是“活”的——它的顶点、面片、属性都可以在运行时动态增删改。UE5 里动态网格的核心数据结构是FDynamicMesh3。这个结构维护了顶点数组、三角面数组、边数组以及各种属性层UV、法线、颜色等。每次你调用 Modeling Mode 的工具底层实际上是在操作这个FDynamicMesh3对象。为什么这个区别很重要因为动态网格编辑的性能开销比静态网格大得多。静态网格可以直接扔给 GPU 渲染动态网格需要先在 CPU 上完成编辑操作再上传到 GPU。所以如果你要做运行时 procedural 生成比如根据玩家行为动态改变地形那就必须用动态网格但如果只是编辑器里的建模操作最终还是要烘焙成静态网格。我做过一个测试一个 5000 面的模型用 PolyExtrude 挤出 100 次每次挤出增加 4 个面最终面数 5400。在编辑器里操作很流畅因为编辑器有足够的 CPU 资源。但如果在运行时每帧都做这种操作帧率会明显下降。所以动态网格编辑的定位是编辑器工具和低频运行时操作不是每帧都跑的高频逻辑。3.2 动态网格的创建与转换流程在 UE5 里创建动态网格有几种方式。最直接的是在 Modeling Mode 里用Create类工具新建一个基本体球体、立方体、圆柱等系统会自动创建一个动态网格对象。另一种方式是把现有的静态网格转换成动态网格用Convert工具或者直接在 Geometry Script 里调用CopyMeshFromStaticMesh。转换过程中有几个关键点需要注意。材质槽的映射静态网格的材质槽会按顺序映射到动态网格的材质 ID 上但如果动态网格编辑过程中新增了面片这些新面片的材质 ID 需要手动指定否则会默认使用第一个材质。UV 的保留转换时 UV 数据会保留但如果你做了布尔或 Remesh 操作UV 可能会被重新计算或丢失。法线的重算动态网格编辑后法线通常需要重新计算用RecomputeNormals可以解决。我通常的工作流是这样的先从静态网格复制一份到动态网格然后在动态网格上做所有编辑操作最后用Bake工具烘焙回静态网格。烘焙的时候可以选择是否保留 LOD、是否生成碰撞、是否合并材质槽。这个流程的好处是原始资产不受影响随时可以回退。3.3 动态网格编辑的性能优化技巧动态网格编辑的性能瓶颈主要在两个方面顶点数量和操作复杂度。顶点越多每次编辑需要遍历的数据量越大操作越复杂比如布尔运算CPU 计算时间越长。优化顶点数量的方法有几个。第一及时 Remesh。编辑过程中面片可能会变得不均匀有些地方密集有些地方稀疏Remesh 可以重新均匀分布。第二用 Decimate 减面。如果某些细节在最终效果里看不到可以直接减掉。第三分块处理。如果一个模型很大可以拆成几个部分分别编辑最后再合并。优化操作复杂度的方法主要是避免不必要的布尔和 Remesh。布尔运算的复杂度是 O(n log n) 级别的两个高面数模型做布尔会很慢。如果只是简单的切割用PolyCut或PolyPlaneCut比布尔快得多。Remesh 也是类似如果只是局部调整用 PolyEdit 手动改比整体 Remesh 更高效。还有一个容易被忽视的点是撤销栈的管理。动态网格编辑的每一步操作都会记录到撤销栈里如果撤销栈太深内存占用会很大。我习惯在完成一个阶段性的编辑后手动清空一次撤销栈用ClearUndo释放内存。提示在编辑器里做动态网格编辑时可以打开Show Advanced Dynamic Mesh Stats来实时查看顶点数、面数、内存占用。这个面板对性能调优很有帮助。4. Geometry Script 联动把建模变成可编程的流程4.1 Geometry Script 是什么以及它能做什么Geometry Script 是 UE5 提供的一套蓝图和 Python API让你可以用代码的方式操作动态网格。它的本质是把 Modeling Mode 里的那些工具函数暴露出来让你可以组合、循环、条件判断实现程序化建模。举个例子如果你要用 Modeling Mode 手动做 100 个不同尺寸的窗户你得重复操作 100 次。但用 Geometry Script你可以写一个循环每次改变尺寸参数自动生成一个窗户。这就是 Geometry Script 的核心价值——把重复性的建模工作自动化。Geometry Script 能做的事情包括创建基本体、布尔运算、挤出、倒角、UV 生成、法线计算、网格查询比如获取某个位置的顶点、网格变形比如根据曲线弯曲、网格合并与拆分等。基本上 Modeling Mode 里能做的Geometry Script 都能做而且还能做更多——因为你可以把多个操作组合成一个自定义函数。我最初接触 Geometry Script 是为了做一个程序化的书架生成器。需求是给定书架的宽、高、深、层数自动生成一个带隔板的书架模型。如果用传统建模每个尺寸都要手动做。用 Geometry Script我写了一个函数输入四个参数输出一个动态网格然后烘焙成静态网格。整个过程不到 100 行蓝图节点但节省了大量重复劳动。4.2 蓝图与 Python 两种调用方式的取舍Geometry Script 支持两种调用方式蓝图节点和 Python 脚本。两者各有适用场景。蓝图节点适合做运行时 procedural 生成或者做编辑器工具给美术用。蓝图的优势是可视化、易调试、可以和游戏逻辑无缝结合。比如你可以做一个蓝图工具让美术在编辑器里拖拽一个滑块就能改变书架的层数实时看到效果。蓝图的劣势是节点多了之后会变得很乱复杂逻辑维护起来麻烦。Python 脚本适合做批量处理、资产导入导出、自动化流水线。Python 的优势是代码简洁、易于版本管理、可以调用外部库。比如你可以写一个 Python 脚本遍历一个文件夹里的所有 FBX 文件自动导入、Remesh、生成 UV、烘焙、保存。Python 的劣势是需要一定的编程基础而且调试不如蓝图直观。我的建议是编辑器内的交互式工具用蓝图批量处理和流水线用 Python。两者也可以结合——用 Python 做批量预处理用蓝图做精细调整。4.3 一个完整的 Geometry Script 实操案例下面用一个具体案例来演示 Geometry Script 的用法。需求是生成一个带圆角的矩形板板上均匀分布若干圆孔。首先用蓝图节点实现。核心步骤如下用Create Box节点创建一个长方体设置长宽高。用Apply Bevel节点给所有边加圆角设置圆角半径和细分段数。用Create Cylinder节点创建一个圆柱体半径和高度根据孔径设置。用Apply Mesh Boolean节点模式设为 Difference把圆柱体从长方体上减掉。用循环节点重复步骤 3-4每次改变圆柱体的位置生成多个孔。用Recompute Normals节点重算法线。用Copy Mesh to Static Mesh节点烘焙成静态网格资产。关键参数的计算假设板子尺寸是 200x100x10圆角半径 5孔径 8孔间距 20。那么孔的数量是floor(200/20) - 1 9个横向floor(100/20) - 1 4个纵向总共 36 个孔。每个孔的位置可以用双重循环计算X -100 20 i * 20Y -50 20 j * 20。如果用 Python 实现代码结构大致如下import unreal def generate_perforated_plate(length, width, thickness, fillet_radius, hole_radius, spacing): # 创建动态网格 dyn_mesh unreal.DynamicMesh() # 创建基础板 box_opts unreal.CreateBoxOptions() box_opts.set_editor_property(dimensions, unreal.Vector(length, width, thickness)) unreal.GeometryScriptLibrary.create_box(dyn_mesh, box_opts) # 加圆角 bevel_opts unreal.BevelOptions() bevel_opts.set_editor_property(distance, fillet_radius) bevel_opts.set_editor_property(segments, 4) unreal.GeometryScriptLibrary.apply_bevel(dyn_mesh, bevel_opts) # 计算孔位并做布尔减 num_x int(length / spacing) - 1 num_y int(width / spacing) - 1 for i in range(num_x): for j in range(num_y): x -length/2 spacing i * spacing y -width/2 spacing j * spacing cyl_opts unreal.CreateCylinderOptions() cyl_opts.set_editor_property(radius, hole_radius) cyl_opts.set_editor_property(height, thickness * 2) cyl_mesh unreal.DynamicMesh() unreal.GeometryScriptLibrary.create_cylinder(cyl_mesh, cyl_opts) # 移动圆柱到目标位置 transform unreal.Transform(location[x, y, 0]) unreal.GeometryScriptLibrary.transform_mesh(cyl_mesh, transform) # 布尔减 bool_opts unreal.MeshBooleanOptions() bool_opts.set_editor_property(operation, unreal.MeshBooleanOperation.DIFFERENCE) unreal.GeometryScriptLibrary.apply_mesh_boolean(dyn_mesh, cyl_mesh, bool_opts) # 重算法线 unreal.GeometryScriptLibrary.recompute_normals(dyn_mesh) return dyn_mesh这段代码的核心逻辑和蓝图版本一致但用代码表达更紧凑。实际使用时你可以把这个函数封装成一个编辑器工具让美术输入参数后一键生成。注意Geometry Script 的 Python API 在不同 UE5 版本之间可能有变化建议先查一下当前版本的 API 文档。另外布尔运算在循环里调用时要注意性能如果孔的数量很多可以考虑先合并所有圆柱体再一次性做布尔而不是逐个做。5. 常见问题与排查技巧实录5.1 工具操作类问题速查在实际使用 Modeling Mode 和 Geometry Script 的过程中我踩过不少坑。下面整理了一些典型问题和解决方法。问题现象可能原因解决方法布尔运算结果破面网格有非流形边或自相交先 Remesh 再布尔或检查网格完整性挤出后面片法线反了挤出方向与面法线不一致用 Flip Normals 翻转或调整 Direction 参数Remesh 后 UV 丢失Remesh 会重新计算拓扑在 Remesh 前备份 UV或用 AutoUV 重新生成Geometry Script 节点报错输入网格为空或参数越界加判空检查参数做 Clamp烘焙后材质不对材质槽映射错误检查 Material ID 设置手动指定材质动态网格编辑卡顿顶点数过多或撤销栈太深及时 Remesh 减面清空撤销栈5.2 性能与内存问题的排查思路动态网格编辑的性能问题通常表现为视口卡顿、操作延迟、内存占用飙升。排查的时候可以按以下顺序检查。第一步看顶点数和面数。打开 Dynamic Mesh Stats 面板如果顶点数超过 10 万操作就会开始变卡。超过 50 万基本就没法流畅编辑了。这时候需要用 Remesh 或 Decimate 减面。第二步看撤销栈深度。UE5 默认的撤销栈深度是 50 步左右如果做了大量操作撤销栈会占用大量内存。可以在编辑器设置里调小撤销栈深度或者手动清空。第三步看是否有泄漏的动态网格对象。在 Geometry Script 里创建的动态网格对象如果不再使用需要手动释放。蓝图里有Release Dynamic Mesh节点Python 里需要确保对象被垃圾回收。第四步看是否在 Tick 里做了重操作。如果动态网格编辑逻辑放在了 Actor 的 Tick 里每帧都执行那性能肯定好不了。应该把编辑操作放在事件触发时执行而不是每帧执行。5.3 资产管理与版本控制的经验用 Modeling Mode 和 Geometry Script 生成的资产管理起来和传统建模资产有些不同。我的经验是动态网格的中间状态不要保存成资产只保存最终的静态网格。因为动态网格资产体积大、依赖多而且一旦保存就很难追溯它是怎么生成的。更好的做法是把生成逻辑蓝图或 Python 脚本保存好需要修改的时候重新跑一遍脚本。这样资产是可复现的改参数就能生成新版本。如果团队协作可以把脚本纳入版本控制每个人都能生成一致的资产。另外Geometry Script 生成的静态网格命名要有规律。我习惯用SM_前缀加功能描述加参数摘要比如SM_Bookshelf_W200_H180_D30_S5这样一看名字就知道尺寸和层数。提示如果项目里大量使用 Geometry Script 生成资产建议建一个专门的文件夹存放生成脚本并且写一个 README 说明每个脚本的用途和参数。不然过几个月自己都忘了哪个脚本是干嘛的。6. 从工具到流程把 Modeling Mode 融入日常工作流6.1 什么时候用 Modeling Mode什么时候用 DCC这个问题我被问过很多次。我的判断标准很简单如果修改是“参数化”的、局部的、快速的用 Modeling Mode如果修改是“造型”的、整体的、精细的用 DCC。举个例子场景里有一面墙需要开三个窗户。这个需求用 Modeling Mode 的布尔工具五分钟搞定。但如果这面墙需要做成哥特式风格有复杂的雕花和曲线那就得去 Blender 里做。再比如一个道具需要调整比例和位置Modeling Mode 里直接拉伸就行但如果需要重新雕刻表面细节还是得回 DCC。还有一个场景是程序化生成。比如你要根据关卡布局自动生成围栏、楼梯、管道这些用 Geometry Script 做最合适。DCC 软件虽然也有脚本功能但和引擎的集成度不如 Geometry Script。6.2 一个典型的混合工作流示例我最近做的一个项目是搭建一个工业风场景里面有很多管道和金属架。工作流是这样的第一步在 Blender 里建一个基础的管道模型包括弯头、三通、法兰这些标准件。导出 FBX。第二步导入 UE5用 Modeling Mode 的 Remesh 工具统一面数用 AutoUV 生成 UV。第三步用 Geometry Script 写一个管道生成器输入起点、终点、管径自动生成路径上的管道段和弯头。这个生成器可以处理任意角度的转弯。第四步在关卡里用样条线Spline定义管道路径然后调用管道生成器自动生成管道网格。第五步对生成的管道做局部调整用 PolyEdit 微调一些连接处的位置。这个流程的好处是标准件在 DCC 里做一次就行后续的排列组合全部自动化。改路径只需要改样条线管道自动重新生成。整个场景的管道系统从设计到完成大概用了两天时间如果纯手动建模至少一周。6.3 团队协作中的规范建议如果团队里多个人都要用 Modeling Mode 和 Geometry Script最好提前定一些规范。命名规范动态网格资产、生成的静态网格、Geometry Script 脚本都要有统一的命名前缀和格式。比如DM_表示动态网格SM_表示静态网格GS_表示 Geometry Script 脚本。参数规范Geometry Script 脚本的输入参数要有明确的单位和范围。比如长度单位统一用厘米角度统一用度参数范围在脚本里做 Clamp。版本规范UE5 的 Geometry Script API 在不同版本之间有变化团队要统一引擎版本。如果必须跨版本要在脚本里做版本判断。测试规范Geometry Script 生成的资产要在不同的硬件配置上测试性能。特别是面数和材质复杂度要确保在目标平台上能跑得动。注意Geometry Script 的 Python 脚本在打包后的游戏里不能运行它只在编辑器环境下可用。如果需要在运行时做程序化生成必须用蓝图节点。7. 我个人的一些实操心得用了这么久 Modeling Mode 和 Geometry Script有几个心得是文档里不会写的。第一个心得养成“先复制再编辑”的习惯。Modeling Mode 的工具虽然可以撤销但有些操作比如布尔撤销后可能无法完全恢复原始状态。我现在的习惯是对任何重要资产做编辑之前先复制一份动态网格在副本上操作。确认没问题了再替换原始资产。第二个心得Remesh 的 Target Edge Length 不要设得太小。我一开始追求细节把 Target Edge Length 设得很小结果面数爆炸编辑器卡得没法用。后来发现对于大多数场景资产Target Edge Length 设在 1-5 厘米之间就够了具体看资产在屏幕上的显示大小。如果资产只在远处出现甚至可以设到 10 厘米。第三个心得Geometry Script 的调试要用 Print 节点。蓝图里的 Geometry Script 节点出错时报错信息往往很模糊。我的做法是在关键步骤后面加 Print 节点输出当前的顶点数、面数、包围盒尺寸这样能快速定位是哪一步出了问题。第四个心得布尔运算之前先做一次“网格清理”。用MeshRepair工具可以修复非流形边、重复顶点、退化面片。清理过的网格做布尔成功率会高很多。这个步骤花不了几秒钟但能省掉后面大量的排查时间。第五个心得把常用的 Geometry Script 逻辑封装成函数库。我把自己常用的几个操作创建带圆角的板、生成阵列孔、沿曲线弯曲网格封装成了蓝图函数库放在项目里。每次新项目直接复制过去就能用不用重新搭节点。最后再分享一个小技巧Modeling Mode 里的PolyEdit工具按住Ctrl拖拽顶点可以沿法线方向移动按住Shift拖拽可以沿屏幕平面移动。这两个快捷键组合在微调的时候特别有用比用 Transform 工具精确得多。
阅读完成 · 觉得有帮助?
咨询建站