让曲率决定网格疏密:AutoRemesher 自适应网格密度完整指南
【免费下载链接】autoremesherAutomatic quad remeshing tool项目地址: https://gitcode.com/GitHub_Trending/au/autoremesher
把一张几十万面的扫描模型重拓扑成几千个 quad,还希望棱角和褶皱不糊——这正是 AutoRemesher 的自适应网格密度要解决的问题。AutoRemesher 是一款自动四边形网格划分工具,它的全局网格尺寸不是拍脑袋定的:先量出表面每个顶点的曲率,曲率大的地方自动加密,平坦处自动放粗,最终输出干净的 quad 拓扑。这篇指南带你拆开这个机制,并给出可调参数和排坑方法。
先看你卡在哪:均匀网格的浪费与细节丢失
手动重拓扑时,你多半遇到过这两个极端:
- 为了保住车身的转折线,全图都铺细网格 → 面数爆炸,一半的三角形花在车顶和引擎盖这种平面上;
- 全图铺粗网格压面数 → 边角一坨糊,动画变形时直接开裂。
矛盾的根源在于:几何细节是局部集中分布的,而均匀网格是全图一个尺寸。解法不是"更努力的手绘",而是让网格密度跟着几何特征走——这就是基于曲率的自适应密度。
一句话价值:把"哪里该密"的判断交给算法
AutoRemesher 的做法可以概括成一句:顶点越"弯",它周围的目标边长就越短;顶点越平,目标边长就越长,总面数预算基本不变,只是把三角形从平面挪到了细节处。
机制拆解:从顶点曲率到 quad 的 4 步
整个流水线大致是这样一条链(各步骤对应源码位置见文中引用):
输入三角网格 → ① 逐顶点计算曲率(法向变化率) → ② 曲率换算成"每顶点目标边长"(受上下限约束,总量守恒) → ③ 各向同性重网格:切长边、并短边、翻转、松弛、投影 → ④ 参数化 + 四边形抽取(frame field 方向引导) → 输出 quad 网格第 1 步:给每个顶点量一个"弯度"
为什么用曲率判断疏密?因为曲率是"表面弯得多厉害"的标量度量。微分几何里有两类基础指标:高斯曲率描述法线旋转的快慢(球面为正、马鞍为负、平面为零),平均曲率描述表面偏离切平面的程度。对重网格来说,平均曲率式的量法更实用——它直接告诉你在某个点附近表面"折"了多快。
具体实现里,算法并没有去解析求曲率公式,而是走了一条更稳的路:对每个顶点,取它周围一圈邻居顶点,比较该顶点法向与邻居法向的夹角,按边长加权平均,得到"单位长度上法向转了多少弧度"(见 src/AutoRemesher/autoremesher.cpp 中的vertexCurvature计算段)。法向变化快的顶点(棱线、褶皱、曲率突变处)自然得到高曲率值。之后还会取非零曲率的75 分位数作为参照值做归一化——这一步很关键,它防止个别极端尖点把整张图的参照系"顶"到全平面。
第 2 步:把弯度换算成每个顶点的目标边长
有了曲率,下一步是回答"这里该用多长的边"。实现里给每个顶点算一个 importance(重要性):importance = 1 + strength × normalized²,其中 strength 由adaptivity参数驱动,normalized 是归一化曲率。再取平方根换算回边长:
- 高曲率顶点 → importance 高 → 目标边长变短 →加密;
- 平坦顶点 → importance 低 → 目标边长变长 →放粗。
同时有两道保险:
- 上下限钳制:每个顶点的目标边长被限制在基础边长的 0.35 倍到 3.0 倍之间(源码里的
minRatio/maxRatio),所以不会出现"某条棱上网格密到爆、隔壁平面几乎没网格"的断层,过渡是平滑的; - 预算守恒:换算按
∫(area / h²)守恒来做,也就是总三角形预算保持你设定的目标量,只是把三角形从平坦区"搬"到细节区,而不是全图加密。
这一步的产出是一张"每顶点目标边长表",随后传给 src/AutoRemesher/isotropicremesher.cpp(它通过setVertexTargetEdgeLengths把这张表交给底层的 thirdparty/isotropicremesher/isotropicremesher.cpp)。
第 3 步:边太长就切,太短就并
各向同性重网格拿着"每顶点目标边长表"反复执行四个操作,直到网格收敛到目标尺寸:
- 切长边(
splitLongEdges):边长超过该顶点目标值的边做细分; - 并短边(
collapseShortEdges):边长低于下限的边做合并,合并点取位置加权平均并投影回原表面; - 翻转 + 松弛(
flipEdges/shiftVertices):让三角形状趋近等边,避免狭长三角; - 投影(
projectVertices):用包围盒树找最近表面,保证顶点不飘出模型。
注意这里的"长/短"是按该顶点自己的目标边长判断的,这正是自适应生效的地方:同一个模型上,引擎盖处的"够短"和轮拱处的"够短"标准不同。
第 4 步:三角形怎么变成四边形
各向同性重网格的输出还是三角形。变 quad 靠两步:先做参数化(src/AutoRemesher/parameterizer.cpp),在 frame field 计算曲率张量(src/AutoRemesher/framefield.cpp)为每个顶点给出一致的切向方向,相当于先想好"网格线往哪里走";再由 src/AutoRemesher/quadextractor.cpp 沿这个方向从三角网中抽取尽可能大的四边形,四边形占比最大化,只在不可避免的极点(singularities)留下少量三角形或 n-gon。方向引导得当,四边形会顺着棱线和特征线排列,而不是横七竖八。
上手:一条命令 + 4 组参数
AutoRemesher 支持 CLI 无头模式,跑通自适应流程只需一条命令:
./autoremesher \ --input model.obj \ --output remeshed.obj \ --target-quads 50000 \ --adaptivity 1.0 \ --edge-scaling 1.0 \ --sharp-edge 90.0 \ --anisotropy 1.0图形界面的设置项由 src/preferences.cpp 通过 QSettings 持久化,界面上调的参数最终汇总到 src/quadmeshgenerator.cpp 的Parameters结构体里(adaptivity、anisotropy、sharpEdgeDegrees、modelType、targetTriangleCount、scaling)。下面按"影响什么"分组讲。
曲率敏感度:adaptivity
这是自适应密度的总开关。adaptivity = 1.0是默认值,内部 strength 取min(adaptivity, 2.0) × 7.0——也就是说调到 2.0 以上不再增强,超过没有意义。经验值:
- 细节多、褶皱深的模型(衣物、植物、复杂曲面):1.5 ~ 2.0;
- 硬表面、大平面为主:0.8 ~ 1.0,平面区可以更大胆地放粗。
整体密度:target-quads 与 edge-scaling
--target-quads决定总面数预算(预算守恒的那条线),--edge-scaling在整体尺度上缩放边长。两者配合:先定预算,再用 scaling 微调"整体偏密还是偏疏",别指望单拉 scaling 就能补回细节——细节密度由曲率决定。
角度阈值与边长上下限:sharp-edge、minRatio/maxRatio
--sharp-edge(默认 90°)定义"法向夹角超过多少度才算锐边":锐边顶点会被锁定,重网格时不跨棱滑动,棱线几何精度因此保住。而最小/最大边长并不直接暴露成参数,内部按基础边长的 0.35×~3.0× 钳制(见前文minRatio/maxRatio),这决定了密区和疏区之间的最大落差。如果你觉得过渡太缓,可以把 sharp-edge 调小(比如 60°)让更多棱线被锁住。
四边形偏好:modelType 与 anisotropy
modelType分 Organic(有机体)和 HardSurface(硬表面)两种模式,影响参数化与抽取时对特征线的处理策略;anisotropy控制方向场贴合表面主方向的强度,值越高四边形越倾向于顺着表面特征排布。想要"尽量多、尽量大的 quad",就保持默认方向引导,把预算集中投给细节区。
场景实战:汽车车身这类复杂曲面
车是自适应密度的典型考场:车顶、引擎盖是大平面,轮拱、C 柱转折、门把手周围是强曲率区。用默认adaptivity 1.0、target-quads 50000跑一版,你会观察到:
- 引擎盖、车顶的 quad 明显更大、更稀疏;
- 轮拱弧线和车身折线处 quad 变小变密,且 quad 的排布跟着特征线走;
- 锐边(如腰线)处网格不跨越棱线滑动,棱线位置保真。
如果轮拱细节还是糊,优先提高adaptivity而不是无脑加target-quads——前者是"把钱花在刀刃上",后者是"撒胡椒面"。反过来,如果车顶出现不必要的细网格,把 adaptivity 往回调,平面区会自然放粗。
常见问题排坑:网格过密过疏怎么判断
- 棱角发糊、转折丢失:先查
target-quads是否太小(预算不够时密区也密不起来),再提高adaptivity;还糊就把--sharp-edge调小,把更多棱线锁成锐边。 - 平面区网格太密、面数超标:降低
adaptivity,或提高edge-scaling;确认modelType选对了(硬表面用 Organic 模式可能保留多余细节)。 - 密疏过渡太突兀:这是内部 0.35×~3.0× 钳制范围决定的正常行为,如果视觉上仍突兀,多半是模型本身有孤立尖刺或噪声面,先用
--smooth-normal轻微平滑输入再重网格。 - 四边形碎、n-gon 多:多半是方向场在特征线附近打架,试试
anisotropy在 0.8~1.2 间微调,或确认sharp-edge把主棱线都吃进去了。 - 想验证机制是否生效:CLI 输出里带
--report的阶段报告能看到各阶段耗时;对比 adaptivity 0 与 2 两次结果,密区疏区的边长差异会直观体现在输出文件里。
机制看透了,调参就不玄学了:曲率定疏密、阈值定棱线、预算定总量。想自己跑一遍,克隆仓库即可:
git clone https://gitcode.com/GitHub_Trending/au/autoremesher【免费下载链接】autoremesherAutomatic quad remeshing tool项目地址: https://gitcode.com/GitHub_Trending/au/autoremesher
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考