扫描记录里,一座建筑也会敞着顶。设想操作人员站在地面采集墙体,屋顶始终处于视野之外。MeshLab 可以把这些残缺的观测数据变成连续表面。要理解这个过程,需要依次看清三项操作:将各次扫描对齐,确定表面朝向,再重建采样点之间的几何形状。[1][5][6]
隆德大学 DARK Lab 的一份教程直观呈现了观测与重建之间的区别:从地面采集的扫描数据在建筑顶部留下空缺,重建却在这些位置生成了圆鼓鼓的凸起。[2] 最终结果中,哪些部分来自扫描仪,哪些部分来自后续处理?
分别采集的扫描需要对齐位置
MeshLab 是处理三角网格和扫描数据的开源工作台,工具覆盖清理、检查、重建以及打印前的准备。[1] 这些功能之所以实用,部分原因在于:一组扫描数据要成为最终成品,其间会经历多种表示形式。
先从图层看起。在项目的 Python 接口 PyMeshLab 中,一个 MeshSet 包含多个网格,分别对应 MeshLab 的图层。每个网格都有 ID,其中一个被设为当前网格。过滤器可以把当前选择切换到它生成的输出网格。[4] 因而,当前状态会影响操作结果:后续操作必须作用于预定的图层,尤其是在新图层刚刚生成之后。
配准将各次采集的数据放入同一坐标系。DARK Lab 的示例使用 MeshLab 对齐工具,对已经基本重合的扫描作进一步调整;偏差较大时,需要先手动完成初步对齐。保存的项目文件记录了各个扫描文件的路径,以及各自对应的变换矩阵。[2]
因此,交接时应一并交付项目文件和它引用的扫描文件。保留独立图层,也便于复核人员在合并观测数据前检查重叠区域。
点还需要朝向
一个点给出一个位置。表面重建还需要知道附近表面朝向何方,描述这个方向的向量称为法向量。
MeshLab 的“Compute normals for point sets”(计算点集法向量)可以在尚未建立三角形网格时估算法向量。邻域点数参数决定周围有多少点参与估算;已知的扫描仪视点有助于确定法向量的朝向。[5] 这又是一次处理选择,发生在可供检查的表面生成之前。
Screened Poisson(筛选泊松)重建以带有方向信息的点为输入,生成水密、完全封闭的表面。Michael Kazhdan 和 Hugues Hoppe 在 2013 年的论文中解释,“screened”扩展加入了位置约束,促使重建表面尽量经过采样点。早期泊松方法存在细节被平滑掉的问题,这项扩展提高了表面与采样位置的吻合程度。[6]
这里的尽量值得留意。输出是拟合得到的表面,与按采集顺序简单连接测量点的做法有着区别。这种方法把样本协调为连贯的几何形状,实用价值由此而来。作为证据,它的局限也出在同一个步骤:形状连贯,仍不足以证明其中每一部分都曾被观测到。
三角形再多,也补不上缺失的视角
重建参数对应着不同的选择。depth 限制求解器所用自适应八叉树的深度:深度为 d 时,网格在每个坐标轴上的最高分辨率为 2^d,实际细分程度随采样密度调整。pointweight 控制输入点位置对结果的影响;将它设为零,就回到了未加入筛选项的泊松重建。输入噪声较多时,可以增大 samplespernode,使结果更平滑。[5]
这些参数处理的是空间细节、表面贴合采样点的程度,以及噪声。它们都无法增加一个扫描视点。即使提高重建的细节程度,原始采集留下的覆盖空缺依旧存在。
DARK Lab 建议保存试验结果时,将重建参数写入文件名。[2] 这个小约定便于比较两份看起来都合理的表面:差异可以追溯到具体参数,记忆中的“更好看的那一版”也就有了明确依据。
清理决定哪些部分会留下
重建完成后,还有进一步的取舍。Alejandro Romero 在布朗大学 VR Software wiki 上的指南介绍了几项操作:移除细小的孤立部分,用 Quadric Edge Collapse Decimation(二次误差边折叠简化)简化几何形状,以及分离连通分量后分别导出。[7] 这些操作各有作用,依次是丢弃碎片、降低复杂度和整理各个部分。
这份独立教程展示了操作人员如何在 MeshLab 中掌握清理过程。在我看来,掌握这些取舍,也就承担了复核的责任。直径阈值可以筛出小部件,它的考古意义却要另作判断。设想正在扫描一件破损的装饰物:研究者最需要保留的特征,恰好就在一小块脱落的残片上。
可以接受多大程度的简化,应由用途决定。DARK Lab 的入门指南区分了缩小比例打印与工具痕迹、颜色分析,两者对采集细节有着不同要求。[8] 这种区别应贯穿处理过程,一直保留到导出文件。
将处理决策与表面一同保存
对于有人能够检查几何形状的小型遗产保护团队,MeshLab 可以让工作按这样的方式展开:交互式检查图层,保存输入数据,待充分理解各步骤的行为后,将稳定的处理步骤自动化。PyMeshLab 的 apply_filter() 会在当前过滤器脚本中记录所调用的过滤器及其参数,脚本可以保存和加载。文档还提醒,同一个 MeshSet 在并发执行过滤器时无法保证安全。[4]
脚本有助于重复操作,同时还需要文字说明,交代为什么删除某一区域,或为什么接受某次重建结果。我会把原始扫描、配准项目、处理参数、软件版本,以及对尚未解决的覆盖空缺的简短说明,与交付网格一同保存。另一位操作人员便可据此重新审视当时的判断。
再回到扫描仪看不到的屋顶。完成后的表面可以用于展示,但仍未必适合作为屋顶形状的证据。MeshLab 让这番转换得以完成,保存中间数据和处理决策,则让转换过程有据可查。
来源
- MeshLab 项目官方网站——开源项目范围、处理工具与 PyMeshLab 接口。
- Stefan Lindgren 和 Carolina Larsson,“Recording 3D data for monuments or larger volumes: postprocessing”,隆德大学 DARK Lab——扫描配准、项目文件、覆盖缺失与重建试验。
- Mythic Society 铭文三维扫描项目,“3D Scanning of the Chikkasanne 9-10Th Century Ganesha Sculpture 08”,2024 年 4 月 25 日,Wikimedia Commons——照片与署名信息。
- PyMeshLab 文档,“MeshSet”——图层标识、当前网格行为、过滤器脚本与并发限制;查阅于 2026 年 10 月 25 日。
- PyMeshLab 文档,“List of Filters”——“Compute normals for point sets”与“Surface Reconstruction: Screened Poisson”;查阅于 2026 年 10 月 25 日。
- Michael Kazhdan 和 Hugues Hoppe,“Screened Poisson Surface Reconstruction”,ACM Transactions on Graphics 32(3),2013 年——论述位置约束与表面拟合的原始论文。
- Alejandro Romero,“Meshlab: Cleaning 3D Meshes”,布朗大学 VR Software wiki——独立介绍清理、简化与分量导出的操作指南。
- Stefan Lindgren 和 Carolina Larsson,“Recording 3D data for monuments or larger volumes: introduction”,隆德大学 DARK Lab——如何让采集要求适应研究与展示用途。