关于 scenario-zbrush-hard-surface
面向 ZBrush 硬表面建模的技能,指导 Agent 以可重复的脚本操作构建切割、倒角、面板与五金件,并通过检查关卡验证造型。它强调清晰的边缘语言、可编辑布尔堆栈和面向目标镜头的细节规划。
主要功能
- 01脚本化创建部件与布尔操作
- 02按面组规划折痕和边缘
- 03动态细分与倒角控制
- 04阵列生成切割和五金件
- 05分阶段检查模型与导出
适用场景
- 01制作游戏道具的硬表面高模
- 02规划开孔、面板和装配缝
- 03重复布置螺栓与通风口
- 04将模型整理后交付烘焙
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-zbrush-hard-surface安装后在 Claude Code 中输入/scenario-zbrush-hard-surface确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/zb_hardsurface.py详细介绍
ZBrush 硬表面
硬表面的成败取决于最终效果:每条边都清晰地呈直线或曲线,平面上的高光均匀,边缘宽到足以捕捉光线,而且每个部件都能实际制造出来,这样看起来才像是工业制品(Plouffe,Klimer)。Agent 通过确定性操作(基本体、Live Boolean 堆栈、作为折痕方案的多边形组、Dynamic Subdivision 数值、ArrayMesh、Panel Loops)构建这种表现语言,只有在没有其他办法时才使用点击和笔画。如果这里提到的某个同类技能不在你可用的技能中,请让用户安装它
(npx skills add scenario-labs/skills --skill <name>);在无人值守时,根据工具架构继续操作,并标记这一缺口。
必备背景: scenario-zbrush-expert(桥接、笔画引擎、审查循环、2026 年陷阱)。
工具包:scripts/zb_hardsurface.py
(import sys; sys.path.insert(0, "<this skill>/scripts"); import zb_hardsurface as hs,然后
hs.hs_call("new_part", "cube")),基于负责人的 zb_ops、zb_review、zb_audit 和
zb_stroke 构建。它尚未在 ZBrush 中运行过。
立场(专家增量)
- 多边形组就是折痕方案。 以 45 度使用 Groups By Normals(33 会捕捉较柔和的平面,60 会漏掉边缘)、Mirror And Weld、UnCreaseAll、Crease PG(Pavlovich;Plouffe)。先加折痕,只有在衰减必须局部化时才加循环线。在后续编辑后使用 Crease PG,会重新给你有意软化的边界加折痕:重新分组,或按角度加折痕。
- SmoothSubdiv 与 CreaseLvl 的差值决定边缘效果。 差值为 0 时效果像剃刀一样锋利,“非常 CG”;CreaseLvl 越接近 SmoothSubdiv,边缘就越紧,因此 4/3 比 4/2 更紧
(
hs.edge_width)。Pavlovich 使用 3/2,并烘焙为 4/2;Plouffe 将 CreaseLvl 保持为 3,配合锋利的 4,并认为 2 太软。判断方法:在金属材质下渲染两种效果,保留看起来最有设计感的较宽边缘。 - QGrid 适用于方正的块体(会让弧线产生分面)。曲线跨度使用 Smooth Subdiv 加 Crease Tolerance,并针对每段调校:22 保住了 Pavlovich 的拱形;数值过低会给弧线的小角度加折痕。
- 布尔运算需要干净的输入(Live Boolean 文档;Pavlovich):封闭无破面、没有共面、密度相近、Dynamic 级别低,且不能有部分隐藏的内容。开启 DSDiv,每个独立部件使用一个 Start 组,然后使用 ZRemesher Detect Edges,Half。布尔运算会丢失折痕、UV、级别和图层;多边形组会保留。
- 让切口和重复排列保持可编辑。 对切割器使用 ArrayMesh,而不是对结果使用。实例化紧固件(NanoMesh、ArrayMesh)便于后期通过一次 Edit Mesh 替换为“平头,而非十字头”;逐个座位导入则每个座位都要调用一次。
- 要么笔直,要么弯曲,不要介于两者之间(Plouffe)。先抛光平面,再处理边缘,最后处理拐角的柔和度,从锐利过渡到平滑;不要让锐边和圆边彼此靠得太近;沿边界加一道凹槽,就能让人觉得这是一块独立的板。
- 细节由功能和镜头决定(Klimer):制作方式、电力流向、统一的紧固件类型、重复的角度保持一致。在引擎中验证两次:先用绑定验证块体(500 到 40k 个多边形),再用低于 1M 个点的高模降面版本验证。看不到的内部和底面保持填充或简化,用深色 AO 表现出来(Pavlovich)。
- 微细节留到确认通过后再做,并放在 3D 图层上(Klimer):负强度会向内雕刻,复制会使效果加倍,而任何拓扑更改都会使图层失效,因此要等到最后一次布尔运算、重网格或 Apply 之后再加图层 [新增]。
- Mirror And Weld 始终将负 X 复制到正 X。 在 +X 上保留正确的一半:先用 Deformation Mirror(Pavlovich,Plouffe)。Slice、Trim 和 BRadius 会忽略对称,因此所有单侧编辑都要在这里完成。
智能体在此处能做什么、不能做什么
| 确定性(编写脚本) | 点击或笔画 [验证] | 仅限 GUI,或替代方案 |
|---|---|---|
Primitives、Unify、placement(new_part、place、import_part);Live Boolean roles(set_roles、roles_from_groups)、DSDiv、Make Boolean Mesh、Show Coplanar 和 Show Issues | ZModeler:保存一个包含操作和折痕选项的笔刷或 2026 预设,在 click_target 处执行一次 canvas_action(首次为拖动;轻点可重放) | Clip、Trim、Slice、Knife(Ctrl+Shift 拖动;press_key 已损坏):布尔切割器、fitted_split_groups、在组轮廓上使用 DynaMesh Groups、ZScript IKeyPress 封装器(scenario-zbrush-automation) |
| Dynamic Subdiv、CreaseLvl、CTolerance、Crease PG、Crease Bevel、Apply | NanoMesh 插入:在目标组的面上点击一次,或在朝前的平面上点击一次(随附宏的例程) | Gizmo 变形器:对齐轴线的零件上的 Deformation 滑块 |
Groups By Normals、Mirror And Weld、Panel Loops、GroupsLoops、ArrayMesh、NanoMesh 滑块、MeshFromBrush(fastener_from_brush)、蒙版(mask_fillet)、ZRemesher、DynaMesh、Decimation | IMM:合成的 Dots 笔画,或在脚本曲线上的 Curve Mode;先运行 imm_ready | Retopo 笔刷、Mask By Polypaint 对话框、自由手绘蒙版、hPolish 平整处理(笔画力度较弱) |
先确定事项
| 输入 | 影响 | 未说明时的默认值 |
|---|---|---|
| 目标用途 | 游戏(烘焙到低模)、影视、印刷收藏品、概念设计阅读 | 游戏资产,烘焙到一张 2048 贴图(Pavlovich 的手枪) |
| 摄像机 | 第一人称和 ADS、第三人称、转台展示、印刷构图 | 第三人称;细节尺寸以该视角下的可读性为准 |
| 预算 | 低模三角面数、贴图尺寸、高模上限 | 报告数量并询问;绝不擅自编造预算 |
| 功能说明表 | 如何开启、通风、供电、制造方式、紧固件系列 | 在白模阶段前先写一份(Klimer) |
| 比例 | 绑定模型:白模阶段使用真实比例;概念设计:使用相对比例 | Unify(约 2 个单位),Z 轴朝前,关闭透视(Chervenka);以毫米为单位的需求通过 to_tool_units 处理 |
| 活动部件 | 铰接式面罩应作为独立部件和 Start 组 | 独立 |
| 交付给 Painter | Substance Bridge,或 OBJ 加外部烘焙 | 询问;两种方式如下所述 |
工作流
- 设置。 将代理或概念模型作为 SubTool;统一缩放,沿 Z 轴前向,X 轴对称;每次布尔运算、DynaMesh、ZRemesher 和 Apply 之前都保存带版本号的 ZTL(Python 无法撤销)。GATE:包围盒最长边约为 2;ZTL 已保存到磁盘。
- 搭建基础形体。 使用
new_part和place,或从 DCC 基础模型中使用import_part;先做主体,切割体放在下方。GATE:将形体检查表(zb_review.review)与概念设计对照;绑定过的资产在细化前,先在引擎中检查其基础 OBJ 和绑定。 - 外壳。 对基本体使用变形滑块,用相减盒体制作开口,执行 Make Boolean Mesh,再运行
zremesh_recipe("after_boolean")。雕刻路线(DynaMesh 128 到 176、hPolish、TrimDynamic)仅用于概念设计。GATE:hygiene(obj)通过(它代替 Check Mesh;Check Mesh 会通过注释报告结果);PolyFrame 显示均匀四边形。 - 规划折痕。 使用
crease_by_groups(45)、dynamic_subdiv(intent="working");使用crease_by_angle添加弧线,并按跨度调整。使用 ZModeler 创建的环线和内嵌面在创建时设置折痕(zmodeler_plan:Insert EdgeLoop 选择 "Crease";Inset 选择 "Crease New Edges" 可形成清晰边缘,选择 "Crease Inner Poly" 可形成圆角;默认值为 Do Not Crease)。GATE:check_crease通过;金属板(review_sheets)呈现柔和、能捕捉光线的边缘,没有波浪起伏,多边形组对称。 - 切口和通风孔。 使用
new_part(..., op="sub")创建切割体,使其穿过表面,切勿与表面齐平;Smooth 3 / CreaseLvl 2,再按角度添加折痕;在切割体上使用array_mesh。之前的 GATE:stack_report()["problems"]为空,coplanar_report无异常,Show Coplanar 快照中没有红色,array_plan的壁面正常。然后运行make_boolean_mesh(超时应设短)。之后的 GATE:UMesh SubTool 与 Start 组相同;Show Issues 快照无异常;重新添加折痕(使用 Crease PG,除非有意软化边界);ZRemesher 之前运行hygiene。任何单侧编辑:运行mirror_report、mirror_weld(keep=...),然后在导出前后对导出内容运行mirror_check。 - 面板和贴合部件。 先将面板规划为多边形组。真正分离面板:使用 Plouffe 的配方执行 Panel Loops(
panel_loops)。贴合开口的面罩或舱口:同一切割体使用两次(fitted_split_groups:在一个 Start 组中执行 Intersect,在另一个组中执行 Subtract),或在组轮廓上使用 DynaMesh Groups。接缝:使用来自border_polylines的薄相减切割体,再用curve_mesh[verify]。蒙版:使用mask_fillet(Klimer 的模糊、反转、重复流程)。GATE:split_copy("groups")的面板计数正确;板上的间隙保持一致。 - 五金件。 统一采用一套系列。使用 ArrayMesh 创建行列;径向排列使用 ArrayMesh Rotate 360,再通过 ZRVar 变化运行
array_commit("nano")(Chervenka);无需拖拽即可从 IMM 创建部件:使用fastener_from_brush;螺栓位置没有面:使用辅助平面。跨越接缝的接口:使用seam_port_groups(Pavlovich)。精确排列:使用spaced_points。GATE:板上所有五金件的数量、朝向和型号均一致。 - 提交高模。 使用
bake_split():在副本上以 4/2 执行 Apply,在原始模型上关闭 Dynamic。精确控制倒角宽度:使用 Crease Bevel 宽度或布尔倒角,因为 Polish 只能给出最小值(Polycount)。GATE:等级 = 1 + Flat + Smooth;edge_language没有含糊的线条;plane_flatness中没有起伏不平的组;pinch_report未标记任何问题。 - 微细节(签核后)。按区域创建图层(Tool:Layers:New;流程 P15)。GATE:每次处理前后都运行
layer_safe(recorded, zb_ops.stats())。 - 低模和交付。 关闭 Dynamic 的笼形网格;逐个部件运行 ZRemesher(
zremesh_recipe("part"));快速制作静态道具:运行dynamesh_visible(res),然后运行一次decimate_percent;或使用 Maya 或 Blender。Klimer 的 ZRemesher 加自动减面曾生成“我交付过的最糟糕的网格”。Painter 流程(scenario-zbrush-retopology-export 会运行这些流程):Substance Bridge Low & High,加上 Auto-Bake 和 Send PolyPaint(bridge_preflight);或使用带折痕接缝的原生 Unwrap(unwrap_creases),然后导出 OBJ。GATE:zb_audit.verdict(..., "game")通过;动画部件需分开。
数值
| 数值 | 用途 | 来源 |
|---|---|---|
| 按法线分组 45(较柔和时为 33,漏选时为 60) | 折痕规划 | Pavlovich;Plouffe |
| 平滑/折痕 3/2 工作、4/2 烘焙、4/3 紧密、4/1 柔和 | 边宽 | Pavlovich;Plouffe |
| 折痕容差 45(单个拱形上为 22) | 按角度设置折痕 | Pavlovich |
| 每个 QGrid 面数 x4,平面或平滑步进;应用级别 1 + 平面 + 平滑 | 面数预算 | DSUB doc |
| 切割器圆柱体采用 8、12、16、24 或 32 个侧面;DynaMesh 烘焙前为 36 到 140 个侧面 | 切割器 | Pavlovich;Polycount |
| ArrayMesh 重复次数 4 到 5 | 通风口 | Pavlovich |
| Panel Loops:Loops 1、Polish 0、Bevel 0、Elevation -100、Double、Ignore Groups | 板件 | Plouffe |
| ZRemesher Half + Detect Edges + Adaptive 0 | 可切割基底 | Pavlovich |
| Keep Groups、Smooth Groups 0、AdaptiveSize 25 | 零件重新拓扑 | Chervenka |
| 面板基底约 3 颗星 | 捏合预算 | Plouffe |
| LazyStep 2(他的估计)适用于接触处,铆钉为 2.5;Curve Step 1 适用于接触处 | IMM 运行 | Pavlovich;IMM doc |
| DynaMesh 探索阶段为 176;游戏外壳为 1000 | 分辨率 | Pavlovich |
| 25k / 1.671M = 1.4 到 1.5 个百分点 | 单次抽取减面 | Pavlovich |
| 每个 SubTool 1000 万个多边形 | 高模上限 | Plouffe |
| 区块为 500 到 40k 个多边形;审核高模时低于 1M 个点 | 引擎检查 | Klimer |
| 2048 烘焙,4 px 填充 | 贴图 | Pavlovich |
质量关卡
- 代码:
stack_report和coplanar_report无问题;make_boolean_mesh()["ok"];hygiene;check_crease;mirror_check;edge_language(没有ambiguous);plane_flatness(obj)["wobbly"]为空;pinch_report;layer_safe;bridge_preflight;zb_audit.verdict。 - 视觉:
review_sheets:用五个视角的 MatCap Gray 检查形体;用金属材质、正视和 30 度掠射角 检查平面与边宽;用 PolyFrame 检查分组和点状折痕线。每次布尔运算后都显示 Coplanar 和 Show Issues。 检查捏合处时,使用低级别模型、深色 polypaint 和低金属度 MatCap。参考references/critique.md进行评判。
常见错误
| 错误 | 表现 | 修正 |
|---|---|---|
| CreaseLvl >= SmoothSubdiv | CG 边缘像刀口一样锐利 | dynamic_subdiv(intent="bake") |
| 在弯曲壳体上使用 QGrid | 弧线呈现刻面效果 | 将 QGrid 设为 0,使用 Smooth 和 crease_by_angle |
| 切割器与主体齐平 | 出现共面细节块;孔洞 | 完全切穿;使用 coplanar_report |
| 没有 Start 组或 DSDiv 关闭 | 零件与主体缝合;UMesh 呈现刻面效果 | set_roles(... start=True);dsdiv=True |
| Mirror And Weld,优质半边位于 +X | 编辑内容被抹除 | mirror_weld(keep="pos")、mirror_check |
| 边缘软化后再 Crease PG | 软化的边缘再次变得锐利 | 按角度 Crease,或先合并组 |
| 切割后留下碎屑 | ZRemesher 失败 | 使用 hygiene,隐藏碎屑,再执行 Del Hidden |
| 对包含细分级别的 SubTool 使用 IMM | 插入被拒绝 | 使用 imm_ready;使用无细分级别的占位 SubTool |
| 拓扑更改前创建了 Layer | Layer 不再生效 | 在最后一次布尔运算之后创建 Layer,或执行 Apply |
| 强制开启 UV Auto-Unwrap | 每个 SubTool 的 UV 都丢失 | 使用 bridge_preflight;关闭该选项 |
交接
- 接收: 用户提供的概念和简报;来自 scenario-3d 的 AI 网格;来自 scenario-maya-modeling 或 scenario-blender-hard-surface 的 DCC 块(OBJ、四边形和三角形);来自 scenario-zbrush-sculpting 的形体处理成果。
- 交付: 带版本号的 ZTL(高模 SubTool、关闭 Dynamic 的笼子)、每个零件各一份且高低模名称匹配的 OBJ、
stack_report和最新的图纸;交给 scenario-zbrush-retopology-export 处理 UV (使用 crease seams 展开、UV Master)、Substance Bridge 或 Multi Map Exporter 烘焙(polypaint ID 通过 Send PolyPaint 或 MME 的 Texture From Polypaint map 传递;尚未确定 OBJ 顶点颜色能否传递) 以及游戏低模;其中 2026.1 Retopo 笔刷需在 GUI 中操作;交给 scenario-maya-modeling、scenario-maya-retopology-uv、scenario-blender-retopology 或 scenario-blender-uv-baking 制作手工低模;通过 scenario-zbrush-paint-render 处理 polypaint ID; 将打印零件交给 scenario-zbrush-pose-print。
ZBrush 2026 注意事项
- Knife(2021.7 至 2022)搭配 Split To Parts(2024)可替代大多数 Slice 和 Trim 流程;Knife 无法切割孔洞。
- ZModeler 2026.0 可在创建时添加 crease(Insert EdgeLoop、Inset);2026.2.1 新增 Bevel All、Outer 或 Inner Edges,并修复默认执行 Extrude 而非 QMesh 的问题。
- Substance Bridge(2026.2.0):Low & High、Auto-Bake、Send PolyPaint;Force UV Auto-Unwrap 为全局设置;每次发送都会创建一个新的 Painter 项目。
- 2026.2.1 修复了 Live Boolean 渲染和 Apply 崩溃问题。ZRepeat It 未随软件提供:使用 Python 循环处理 SubTool。
- 阻塞问题(2026.2.1 界面字符串):共面 Make Boolean Mesh;Mirror And Weld 上的 floor Elv; 导入时的 n-gon;带细分级别的 DynaMesh;Check Mesh Integrity 结果 [verify];当当前笔刷已是插入笔刷时, Create InsertMesh 的 Append-or-New 提示;随软件提供的 Create Instance Subtool 宏会以注释结束。
- 带前缀的标签:
s.SmoothSubdiv、P.Panel Loops、a.Repeat、m.Width;Tool > Geometry 下的分区不增加路径层级。在 macOS 上按 Cmd+W 会退出 ZBrush;Control+W 会创建组。
参考资料
references/expert-notes.md:专家原则、时间戳和决策条件;规划时加载。references/procedures.md:完整的桥接流程;编写代码前加载。references/critique.md:评审标准;每个关卡都要加载。references/gui-paths.md:调色板、快捷键和笔刷;步骤仅限 GUI 操作时加载。references/sources.md:所有来源、凭据、URL 和时间戳。