去年冬天接了个智能穿戴的项目,客户拿来的概念图是那种有机流动的曲面造型,像鹅卵石被水冲刷了千年。我第一反应是用NURBS硬做,双轨扫掠加混接,结果卡在指环扣那个渐消过渡上——曲面连续性怎么调都别扭。那天凌晨两点,我盯着屏幕上那几块补丁,决定换赛道:用网格细分做基底,再转回NURBS。这个决定让我和Weaverbird死磕了整整两天。今天把这段踩坑经历完整复盘出来,给正在纠结细分工作流的同行一点参考。

一、需求拆解:为什么NURBS这次不灵了
先交代项目背景。产品是一个智能指环,外壳需要三个特征:第一,主体是变截面回转体,截面从圆形渐变到椭圆;第二,顶部有一道有机形态的渐消棱线,从宽到窄最后融进曲面;第三,整体要求G2以上连续性,因为要出高光渲染图给投资人看。
用NURBS做前两个特征没问题,问题出在第三个。渐消棱线如果用双轨扫掠生成,末端消失处必然产生收敛点,那个区域的曲面法线会突变,高光一打就露馅。传统做法是切掉收敛区再补四边面,但补出来的面与周围匹配时,G2匹配需要反复调控制点,效率极低。更致命的是,客户后续可能改截面曲线,NURBS历史记录一断,整个模型要重做。
我当时的判断是:这种有机渐消+变截面的组合,本质上是拓扑变化问题,NURBS的四边面拓扑天生不擅长处理。而网格细分(Subdivision)的核心优势恰恰是任意拓扑——它可以先搭一个低模笼子,通过细分算法自动生成光滑曲面,渐消处只需要控制笼子的边流(Edge Flow)即可。
二、技术选型:为什么是Weaverbird而不是T-Splines
Rhino平台做细分,绕不开两个插件:T-Splines和Weaverbird。前者是真正的NURBS细分,能直接输出NURBS曲面;后者是基于Catmull-Clark算法的网格细分工具集,输出的是网格,需要转换。
我选了Weaverbird,原因有三:
- 成本:T-Splines被Autodesk收购后授权费不菲,Weaverbird免费且开源。
- 算法透明:Weaverbird的Catmull-Clark实现可以调权重,我需要对渐消区域做非均匀细分。
- 工作流匹配:我的流程是网格细分→转NURBS→倒角出图,Weaverbird的
wbCatmullClark配合wbJoin能直接生成四边面网格,转NURBS时结构更干净。
但这里有个坑要先说:Weaverbird输出的是四边面为主的网格,不是纯四边面。在渐消末端,如果笼子拓扑没搭好,细分后会出现三角面。三角面转NURBS会变成退化曲面,高光必断。这个问题后面会展开讲。
技巧提示:Weaverbird的细分级别(Subdivision Level)不是越高越好。Level 2到Level 3的视觉差异很小,但面数翻4倍。转NURBS时面数越多,后续匹配越慢。我的经验是Level 2足够,局部需要更光滑的地方用
wbFrame单独提级别。
三、踩坑实录:从笼子搭建到细分翻车
第一天上午,我搭好了低模笼子。主体用圆柱体变形,渐消棱线处手动加了两圈边。信心满满地跑wbCatmullClark,结果出来一看——渐消末端鼓了一个包,像被蚊子叮了。

问题出在边流密度。Catmull-Clark算法的本质是:每个面取面心,每条边取中点,然后连接这些点生成新面。如果某条边周围的边流密度突变,细分后曲率就会突变。我在渐消末端为了控制形状,把边距压得很近,结果细分算法把这种密度差异放大了,产生了局部曲率尖峰。
解决方案是均匀化边流。我把渐消区的边距从0.2mm调整到0.8mm,同时在棱线两侧各加了一圈辅助边,让密度过渡更平缓。重新细分后,鼓包消失,但出现了新问题:渐消棱线的锐度不够了,因为Catmull-Clark天生是平滑算法,它会把锐边磨圆。
这里要引入一个关键参数:折痕权重(Crease Weight)。Weaverbird的wbCatmullClark组件有一个Crease输入端,可以给指定边设置权重。权重为0时完全平滑,权重为1时保持锐边。我最终给渐消棱线设置了0.6的折痕权重——既能保持棱线清晰度,又不会产生硬边高光断裂。
但折痕权重有个副作用:它会让细分后的网格在折痕处产生非四边面。我检查了一下,棱线末端出现了三角面。这意味着转NURBS时那个区域会出问题。我的处理办法是:在转NURBS之前,用wbTriangulate把三角面区域局部三角化,然后用wbQuadrangulate重新四边化。这个操作听起来绕,但实际效果是把三角面的位置从棱线末端移到了不影响高光的区域。
注意:Weaverbird的折痕权重只影响细分结果,不会改变原始笼子。如果你需要后续修改,原始笼子的边流才是根本。我的习惯是笼子阶段就把边流调好,折痕权重只做微调,不超过0.7。
四、转NURBS:网格到曲面的最后一公里
网格细分完成后,下一步是转NURBS。Rhino自带的MeshToNurbs命令可以直接转,但转出来的是一堆独立曲面片,连续性只有G0。要得到G2连续的曲面,必须用Patch或者NetworkSrf重新拟合。
我的做法是:先用wbJoin把细分网格合并成一个整体,然后用ReduceMesh减面到原来的30%,再用MeshToNurbs转成单一网格曲面,最后用FitSrf拟合。拟合时的公差设置很关键——公差太大会丢失渐消细节,太小会产生控制点震荡。我试了三组参数:
| 公差设置 | 控制点数量 | 渐消还原度 | 高光质量 |
|---|---|---|---|
| 0.01mm | 约1200 | 95% | 轻微波浪 |
| 0.05mm | 约600 | 88% | 光滑但有钝感 |
| 0.02mm | 约850 | 92% | 最佳平衡 |
最终选了0.02mm。这个公差下,渐消棱线的锐度保留了92%,高光过渡自然,控制点数量也在可编辑范围内。后续客户改截面曲线时,我只需要调整笼子的截面控制点,重新跑一遍细分和拟合,20分钟就能出结果——这比NURBS重建快了不止一个量级。
五、交付复盘:哪些地方可以做得更好
项目最终按时交付,客户对造型满意。但复盘下来,有几个地方我走了弯路:
- 笼子阶段花了太多时间:我一开始用NURBS思维搭笼子,试图精确控制每一条边。后来发现,细分建模应该先抓大形,细节留给折痕权重和细分级别。笼子阶段用
SubD工具(Rhino 7自带)直接拖拽,效率更高。 - 折痕权重调晚了:应该在第一次细分后就检查折痕效果,而不是等转NURBS时才发现问题。Weaverbird的预览功能可以实时显示折痕,我后来养成了边调边看的习惯。
- 转NURBS的减面比例:30%是我试出来的,但不同模型的最佳比例不同。建议用
ReduceMesh时先设50%,逐步往下试,观察高光变化。
如果重做一次,我的流程会是:SubD搭笼子→Weaverbird细分Level 2→折痕权重微调→局部三角化修复→ReduceMesh减面→FitSrf拟合。整个流程从搭笼子到出NURBS,熟练后4小时以内。

最后说一句技术判断:Weaverbird不是万能的,它适合有机形态+渐消特征+需要快速迭代的项目。如果你的模型是规则几何体,或者需要精确的尺寸控制,老老实实用NURBS。工具没有优劣,只有匹配与否。
关于火星人教育
这次项目复盘里的细分建模思路,其实是我们火星人教育工业设计课程中的一个实战模块。火星人教育创办24年来,一直专注数字艺术与AIGC实战职业技能培训,开设课程涵盖AI漫剧创作、AIGC视觉设计、UE5游戏特效、室内全屋定制、MAYA三维动画、C4D动态设计、工业设计、NUKE影视后期、摄影摄像实训。北京、深圳双校区开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,以项目化实训教学,夯实专业技能,助力就业与职业提升。如果你对Rhino细分建模或者AIGC视觉设计感兴趣,欢迎咨询:010-65918670。








评论(0)