记录一下最近想搞一个3d模型自动减面工具,也寻求L站大佬集思广益看看有没有更好的方法?

Niya 2026-06-27 18:56 1

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容:



  • 我的帖子已经打上 开源推广 标签:

  • 我的开源项目完整开源,无未开源部分:

  • 我的开源项目已链接认可 LINUX DO 社区:

  • 我帖子内的项目介绍,AI生成、润色内容部分已截图发出:

  • 以上选择我承诺是永久有效的,接受社区和佬友监督:


以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出




仓库地址:GitHub - PaiPai121/OccamForge · GitHub


(系统反馈github项目要用开源推广,不过我感觉这个东西还远没到能推广给大家用的程度,希望各位给点建议,板砖轻拍)


Background


大概是最近没什么意思,想弄 Blender 搞个犀牛坦克和灰熊坦克的模型,导入到天际线里面看刁民们开坦克上班。


同时又琢磨要不要顺便 3D 打印一个玩,就倒角、突起、格栅啥的该做做。反正我水平也一般,很快糊出来一坨屎。


这个面数直接爆炸。导入天际线的车辆资产,面数怎么着也应该是千级的吧,可是这个时候我却发现我这坨屎直接 60000 面。


我替大伙尝试过了,这个面数直接导入不进去,60000、45000、35000 都不行,30000 以下才勉强行。但是你一辆车就 30000 个面是不是太过分了?那么多刁民一掏口袋坦克,电脑岂不是冒烟?


但是我又不想手动重新建模(虽然说让我重新做个简单盒子,估计早就做完了),于是就想能不能利用 AI 做一个自动减面的工具?而且减面完了自动烘焙贴图,然后导入到城市天际线中去。


和 AI 大概聊了一下,目前大概有三种路线:


路线 1:人工 Retopo


这是 AAA 游戏的常规做法:



高模



美术重建低模



Bake


路线 2:Simplygon 路线


核心思想:


- 识别特征


- 保留轮廓


- 删除细节


本质上还是:



QEM + Feature Preservation


路线 3:现代研究路线


近几年开始出现一些新的方向,例如:


- Feature Aware QEM


- Mesh Simplification in the Wild


核心思想:


- 保留边界


- 保留高曲率区域


- 保留法线变化大的区域


优先压缩:


- 平面


- 重复细节


人工的方法肯定是不考虑的,我也不是拿去做商业模型,没有那么高的精度要求。当时觉得我的模型都是比较简单方正的,也许简单的路线 2 就可以 work。删一删特别小的面,合并合并,可能面数一下子就降低了。


V1 Rule-Based Optimizer


于是说干就干,立刻让 Codex 开始操刀。


Preprocess


最初先进行一次低风险的清理:


- 对共面或近似共面的多余三角做 Limited Dissolve


这一步不会大幅改变形状,是比较安全的默认开启项,但是效果一般。在 `rhino_tank` 上:


- `62,656 → 60,310 tris`


- 减少 `2,346 tris`


- 约 `3.74%`



可以说,离我们的目标还有很远,于是就需要进一步处理。所以这里理所当然地想到构建一个 pipeline,由保守到激进,看哪一步能够达到目标面数就停止。


Geometry Report and Conservative Candidate-Aware Reduce


在刚才的安全减面后,就得考虑哪里可以删面了。预处理后会先出一个 report,判断哪里适合优化:


- 平面区域


- 高密度区域


- 曲率区域


- silhouette 外轮廓贡献


- 可减面候选


- 应保护区域


- 可疑区域


再把这些面大概分成:


- `MUST_KEEP`


- `SOFT_KEEP`


- `REDUCE_FIRST`


- `DELETE_CANDIDATE`


然后进行预处理后的第一次减面:


- 使用 Geometry Report 的候选区域


- 保护 silhouette 和高重要结构


- 优先处理安全区域


- 不强行达标



效果嘛,肯定还是有效果,但是仍然达不到我们的目标。很多小纹理其实已经不需要保留,但是判断不出来,面数还是过多。那就需要更加激进的策略了。


Aggressive Reduce


最开始直接让它自由减面,坦克直接不成样子,图我也没留,就不提了。


后来和 Codex 讨论,就加了更详细的规则:


2A Structural Protection Expansion


不只保护 silhouette 命中的三角,还会扩张一圈邻接区域,避免只保护几百个点导致结构塌陷。


2B Detail Candidate Detection


标记低可见性小细节、细碎装饰、可删除或可强压缩区域。


2C Bucket-Based Controlled Decimate


按 bucket 分强度减面:


- `MUST_KEEP` 基本不动


- `SOFT_KEEP` 中等减


- `REDUCE_FIRST` 强减


- `DELETE_CANDIDATE` 极强减或清理


2D Local Fallback


如果还高于目标,继续优先压低重要区域;最后才考虑更危险的压缩。


Stage 2 的目标是:主体、炮塔、炮管、车体大轮廓先保住,再牺牲细节。



Detail Suppression


效果不够,自然还需要继续改,于是又有了新的一步。它的定位不是大范围 decimate,而是专门处理:


- 小钉子


- 小倒角


- 局部纹理


- 圆环


- 细长条带


- 重复高密度小特征


目前主要通过通用几何规则识别低重要细节,然后用更强的 Limited Dissolve / 局部清理处理。它已经让形状更稳定,但还有提升空间,尤其是更精准识别环状、条带状、重复细节。



效果嘛,只能说到这一步为止,多少有的用,但是离目标还远得很,该清除的细节还是没有清除。


导入游戏测试


不过做都做了,导入游戏试试看!



不过导入的时候我发现了一个傻 der 的事情。在渲染热力图的时候,AI 实现的方案是把响应位置替换成目标颜色的材质,然后它就清空了。



于是原本直接 build 烘焙的模型自带的贴图有颜色,它 optimize 以后反而成素体了!!!!!不行,给我改。



fine,导出和烘焙是没问题的,还是想搞好这个自动减面。


感兴趣的话可以看一下:OccamForge v1.0.0。


V2 cost simplifier


但是吧,这样也不是一个办法,细小的纹理识别还是很差。再让 AI 搞下去,它就要针对坦克的样式去硬编码地写 if else 了。


目前的方案如果再继续去做 stage 4、stage 5、stage 6,就会变得像 if else 堆起来的 rule-based 自动驾驶规控系统,庞大却又永远有解不完的问题。毕竟我当规控工程师这么久了我能不知道么。


于是让 AI 大概搜了一些现行方案。这里不过多赘述了,总之就是去用各种cost指标去评估哪些边可以塌陷,哪些不可塌陷。如果有感兴趣的朋友可以看 AssetForge 自动减面记 V2:和 Edge Cost 继续较劲 - KK空间


调研了一下QEM相关的内容,并让ai根据计算规则大哥绘制了一下



不过这里立刻就能发现一个问题,我们的需求是什么,这个 cost 又是在做什么?


举个例子,如果我们是一个大正方体,其中有一个面上有一个小尖尖,那么按照这个 cost 的设计,这个尖尖的 cost 应该会比大正方体的 cost 要高,但是这显然不合理。因为我们的需求是希望这个尖尖作为一个不重要的特征被清除掉。


用 AI 大哥总结的话讲,我们真正想保留的是 Silhouette 而不是 Curvature。


比如说轮毂细节:


虽然几何重要,但是视觉不重要


最终拍下的cost思路大概是



vertex importance / face evidence / scale signal



project / aggregate onto edges



final edge collapse cost


比如:




C_{final}(e=(u,v)) =

C_{QEM}(e)

\cdot W_{importance}(e)

+ P_{boundary}(e)

+ P_{sharp}(e)


其中:




W_{importance}(e) =

f(\max(I(u), I(v)), \max(S(u), S(v)))


这里大概画了几种cost (SVG文件好像显示的不太正常啊)




以及组合起来的score



(不过和AI大哥讨论的时候,大哥总是说这个不应该叫cost,还是叫score更合适)


Local simplification executor


有了cost分布,接下来就算需要把前面 heatmap diagnostics 和 combo score 产生的“哪里可以删”的判断,真正变成一个可执行的 edge-collapse 减面流程。


这个就不细说了,想了解的朋友也可以看这个博客链接


v2版本效果




(这个版本最开始还有贴图bug,不过现在修了)

OccamForge v2.0.1 release


当前版本的话就是面是减下来了,但是还是达不到理想的目标,不知道佬们还有没有什么建议

最新回复 (17)
  • Joel Stodolski 06-27 18:59
    1

    俺是废物,3D 模型怎么建就已经把我拒之门外了!佬有 AI建3D 的教程/项目吗?

  • prosumer 06-27 19:10
    2

    单纯路过, 佬的V3方案看起来挺成熟的, 不过我记得autodesk fusion之类的都有减面工具吧

    另外担心会做成屎山(

    越是这种涉及高深算法的东西AI越是容易糊出来一个假装能用但是实际完全不对的东西上去

  • Niya 楼主 06-28 02:13
    3

    我也没有什么很好的想法,所以想来问问大家,集思广益

  • Niya 楼主 06-28 02:15
    4

    现在减面工具感觉都不是特别满足想法,特别是很多地方减面减少的是大面保留的是细节,可是我反而恰恰希望细节不要保留那么多。另外为了防止ai胡写所以每一步提到论文我都会去看一下论文原文,并且和他讨论清楚数学表达才会让他开始搞。

  • Niya 楼主 06-28 02:17
    5

    v2设计的链接好像贴错了,应该是AssetForge 自动减面记 V2:和 Edge Cost 继续较劲 - KK空间

  • toxicbaby 06-28 02:24
    6

    可以试试[2408.02555] MeshAnything V2: Artist-Created Mesh Generation With Adjacent Mesh Tokenization、 [2606.04621] MeshFlow: Efficient Artistic Mesh Generation via MeshVAE and Flow-based Diffusion Transformer。(估计细节会很差

  • prosumer 06-28 03:24
    7

    按照v3来看主要问题在于如何通过数学表达区分细节和主体吧


    这个感觉可能和二阶导有关系(越陡峭越是主线,越平滑越是细节)


    或者某种意义上类似于设施选址问题

    objective: 最小化顶点数量(或面数)

    constrains:

    对于原始模型表面S_h上的所有点p,其在简化模型S_l上的最近点投影q必须满足:



    1. 距离误差 ||p - q|| < ε_dist

    2. 法向误差 angle(N_p, N_q) < ε_normal


    其实类似于给定客户位置(也就是S_h)来确定仓库位置(S_l),要求开设仓库最少


    越看越感觉像这个问题

  • Niya 楼主 06-28 12:00
    8

    这个问题其实v2的也考虑过。但是一阶、二阶的微分的区分都不太好真实的判断出来。因为我们其实不是想丢掉所有细节,比如车体上的铆钉,炮台顶上的门,这些小结构是希望丢掉的,但是本身的车轮、履带的边缘、炮管这些又是希望留下了的,调参总是会要么删多了要么留多了。

    score和cost感觉都缺少一种像模型一样对语义的理解

  • Niya 楼主 06-28 12:01
    9

    感谢!我今天看下这两篇看看有没有办法优化当前的结果

  • prosumer 06-28 15:53
    10

    要搞语义理解只能上神经网络了,普通数学模型有点难

  • Herta42 06-28 16:09
    11

    blender做不了吗?需要开发一个新的工具吗?

  • Niya 楼主 06-30 19:09
    12

    是blender做,这里是想把人工操作blender的过程自动化,后台都是api调的blender

  • 后皇嘉树 06-30 23:01
    13

    其实你这个网格多,主要是很多小的特征,例如一个圆柱,就需要很多三角面片去近似。


    个人感觉,这种情况,把炮筒分离出来,其他地方直接取凸包,然后贴图烘焙就好

  • Niya 楼主 07-01 00:08
    14

    嗯,手工操作这样是比较简单。但是就想能不能更进一步的自动化呢

  • li1shan 07-04 13:36
    15

    3D的MAX好像目前只有有自带的 如果要做到游戏里面用的话 好像也不是特别理想

  • JL 07-22 12:07
    16

    用tripo3d.ai是不是就挺好的?我感觉这个做出来的精度已经很高了,都能直接3D打印,我用它前不久做过3D打印的小手办,感觉已经惊艳到我了

  • Niya 楼主 07-23 00:50
    17

    嗯嗯这个是很好,不过感觉布线比较乱,面数也比较多,导入游戏以后数量多的话有点耗性能

* 帖子来源Linux.do
返回