USDCraft:不用重训大模型,让AI读懂尺寸再造可动3D模型
2026 年初,有一群做机器人的人遇到了一件挺尴尬的事。他们想让机器人在仿真环境里练习开抽屉、按面包机的开关,练好了再搬到现实世界里用。这套路数叫"real-to-sim-to-real",听着挺顺,先造一个和真实物体一模一样的数字分身,在电脑里让机器人反复练,练熟了再放到真实物体上。问题出在"造一个数字分身"这一步。
2026 年初,做机器人研究的这群人碰上了一件尴尬事。
他们希望机器人先在仿真环境里把开抽屉、按面包机开关练熟,再挪到现实里用。这套做法叫“real-to-sim-to-real”:先造一个与真实物体完全一致的数字分身,让机器人对着它反复练,练好了再上真家伙。
麻烦就卡在“造数字分身”这一环上。
**虚拟抽屉的把手要是比真实的偏了两厘米,机器人在里面练得再熟,到现实里照样抓空。**
NVIDIA 与南洋理工、北大团队合作的论文 USDCraft,处理的正是这种“差之毫厘谬以千里”的局面。
### 数字分身为啥难造
造“能动的 3D 资产”,这几年大致走过两条路。
一条是让模型先看一个静态 3D 网格模型,自动切分成若干零件,再推断每个零件怎么动——门绕哪根轴转、抽屉沿哪条轨道滑。Particulate、SIMART 属于这一类,论文称其为“mesh-based”方法。
网格(mesh)*:3D 建模最常用的表示方式,靠无数三角形拼出物体表面,类似用乐高积木拼出一个轮廓。
这条路有两个硬伤。真实扫描得到的物体表面常常不完整,扫描仪照不到的角落就是空白;不少零件还“粘”在一起,门和门框连成一坨几何体,模型分不清谁是谁。更麻烦的是,这类方法依赖大量标注数据训练,碰上训练集里没见过的类别,比如造型古怪的老式缝纫机,模型就抓瞎了。
另一条路不依赖扫描网格,直接让大语言模型凭借对世界的常识,从零写代码生成物体。Articraft、Procedura 走的是这个方向。
灵活是它的好处,不挑物体类别,AI 什么都见过。坏处也致命:手头有个真实物体要复刻时,这类方法手里没有测量数据可参照,生成的尺寸跟真家伙对不上号,做出来好看是好看,就是不像原件。
**论文开篇点出的矛盾正在这里:精确的方法不够灵活,灵活的方法不够精确。**
细想之下这个矛盾挺眼熟。好比请两种人复刻一件家具:一位是严谨的木匠,拿卷尺一寸一寸量,但只会照图纸做,图纸缺一角就不知道该怎么补;另一位是经验丰富的老师傅,什么家具都见过,凭记忆能做出个大概,可没量过尺寸,成品总跟原件差那么点意思。只用木匠,缺角的地方永远是个洞;只用老师傅,抽屉把手可能偏出两厘米,机器人伸手就扑空。USDCraft 要做的,是让这两种人变成同一个人。
### 核心思路:先让 AI 学会看尺子
概括成一句话:用一个预训练好的大语言模型(不必为这项任务专门重训)来写代码、生成物体的 3D 模型;代码写完后还要反复检查、修改,检查所依据的,就是原始扫描得到的真实几何数据。
技术难题随之而来。
大语言模型处理的是文字,没法直接“看”3D 网格文件。丢给它一堆三角形顶点坐标,它消化不了——信息量太大,上下文窗口塞不下。换成渲染图呢?尺寸信息丢了,物体内部结构也看不到。
论文把这个转换步骤称为“源几何分析”(source geometry analysis)。
源几何分析*:把 3D 网格模型转成一段带精确尺寸的文字描述,语言模型就能像读说明书一样“读懂”物体形状。
具体做法是:把物体放进一个规则的三维网格(可以想成三维方格纸),沿竖直方向逐层切片,每层记下哪些格子存在扫描到的表面、哪些格子是空的。巧思在于,没被扫描到的格子既不标“空”也不标“实心”,而是如实标成“未知”。
这个区分很要紧。扫描有破洞的地方,不代表那里真是空的(也许只是传感器没照到);封闭外壳的内部,也不代表一定是实心(里面可能藏着电机)。给语言模型留出“我不确定”的选项,它才敢在图像和常识引导下大胆补全缺失部分,而不是瞎编。
这有点像一个法医面对不完整的骸骨:把所有缺失的骨头都当成“原本就没有”,复原出的骨架必然残缺畸形。专业的做法是先标明“这块缺失、未知”,再结合解剖学常识合理推断缺失骨头的大致形状——既不拍脑袋乱猜,也不干脆放弃。少了这个区分,模型要么把洞当成真实凹陷复刻出来(丑),要么什么都不敢补(残)。
只有粗粒度的全局切片还不够精细。USDCraft 因此给模型配了一件“放大镜”工具,叫网格检查(mesh inspection):模型能依据参考图片和当前建模计划,主动要求渲染某个局部视角,查询某片区域的具体边界、点分布与表面朝向。
这两样能力凑到一块,模型就能既把握整体轮廓,又能追查局部细节。整个过程中,它都是以文字为媒介在“看”,这个语言模型并不需要为理解 3D 专门做训练。
还有一个关键的设计取舍:USDCraft 并没有让模型直接吐出一堆三角形网格,而是把每个物体写成一段能跑起来的程序代码。
乍一看这路子有点绕,为什么不干脆在网格上动手改?原因在于,程序里的零件、关节、物理参数全都落在显式变量上。抽屉把手的坐标写成 (x=0.12, y=0.05),这个数值就摆在代码里。后面检查发现“把手往前偏了 0.64 毫米”,模型能直接找到对应那一行,改个数字就完事,不必把整块几何推倒重做。
代码还能凭空造出扫描网格里根本没出现过的零件和连接关系,比如一个被扫描仪彻底挡住的内部弹簧。只靠“切分已有表面”的做法做不到这一点,因为手里压根没有那块材料可切。
这套工具箱混用了两种建模手法:CadQuery 负责有精确尺寸、带棱角的机械零件,比如螺丝、支架;SDF(signed distance field,有符号距离场)负责圆润的有机形状和平滑过渡的曲面。材质、贴图、贴花这些外观内容,也一并写在同段代码里。
这个选择好比装修房子的两种做法。一种是在毛坯墙上直接刷腻子抹灰,动一处就得把那片墙铲掉重来;另一种是先出 CAD 图纸,要改哪里就改图纸上的数字,再重新打印。前一种改起来慢,还容易出错;后一种多了一道“画图纸”的工序,后期维护却省事得多。USDCraft 走的是后一条路,代价是模型得先学会“画图纸”这件麻烦事,换来的是反复修改时的高效率。
更关键的是,这段代码编译完成后,碰撞体积、质量、摩擦系数、关节限位这些物理参数已经自带,可以直接加载进 Isaac Sim(英伟达的机器人仿真平台)跑起来,人工不用再调任何参数。
PhysX*:这是英伟达做的一套物理引擎。仿真世界里的碰撞、重力、摩擦力等物理效果,都由它负责运算,Isaac Sim 仿真平台也把它当作底层引擎。
写出第一版代码只是开头,接下来要解决的是怎么揪出代码里的错误并修正。
论文把这个环节称为“迭代几何复核”(iterative geometric rechecking)。做法是把生成的候选模型,按与原始扫描相同的“切片文字描述”方式重新编码一遍,再拿两份描述做比对。
比对会得到两个集合。一个叫