2015年12月3日

残缺之美 第二部:照片重建/去光

作者 Min Oh

欢迎回到这个残缺之美的系列,今天来写第二部。在这篇中,我们来看一下通常做法下是如何对照片做重构的。我们一起看一下如何使用 Agisoft PhotoScan 软件,以及对贴图去除光照的过程,还会附上在制作我们风筝演示的过程中我学会的一些贴士。 

准备阶段

在开始使用 Agisoft PhotoScan 处理照片前,要先对照片做一次挑选。在挑选的时候要考虑这样几个问题。照片应该要足够的锐利,如果照片本身太模糊的话,会得到一个糊糊的模型以及糊糊的贴图。同时还需要确保几张照片加起来能够覆盖到目标物体的各个角度,同事照片本身也不应该在同一位置上重复太多。更多的照片数量并不意味着能得到更好的结果。最好的做法是先用较少的照片来处理,然后如果有空缺的话在加上所缺部分的照片。请花一点时间来一张张选择所需要的照片,在挑选照片上花费的时间是值得的,它将会节约之后用于修改模型的时间,这样反而能够更快的得到所需的 3D 模型。 

系统设定和 Agisoft Photoscan 设定

Agisoft Photoscan 是一个重度依赖 CPU,GPU 及内存等硬件机能的软件。为了较快的处理过程,需要一台还不错的机器才行。如果有一块很好的显卡(NVIDIA GeForce 8xx 系列及后续产品),那你可以为照片重构的处理过程设置 GPU 的 OpenCL 的加速,这会显著的缩短处理时间。 

还有其他一些摄影相关的软件,大家可以尝试一下,看看什么样的软件最适合你的项目。
https://en.wikipedia.org/wiki/Comparison_of_photogrammetry_software

扫描照片重建的通用流程

1. 对齐照片

第一步是对齐照片。这个步骤是为了搞清楚各个照片的位置和朝向。“对齐照片”算是在整个重建过程中比较快的一个步骤。可以通过执行“估算照片质量 (estimate picture quality)”来快速的检查照片的质量数据。如果这个数据低于 0.5,则建议禁用这类照片。

每个蓝色小方块代表一个摄像机的方向和朝向

2. 构建点云

接下来,需要执行“构建稠密的点云(building dense point cloud)”的过程,在三维空间生成一组 X,Y,Z 的点的集合。我发现先只跑“最低”质量的设置会更节省时间,也更有效率。根据最低质量结果下的点云,就已经能够看到哪些东西将会被处理,以此便能删除一些不喜欢被处理的部分的点云。这不仅仅节省处理的时间,同时也能让人更加专注在所希望的那部分模型的更好的细节上。在清理完第一遍低质量生成的点云后,便能以希望的质量在处理一边。“极高”的设置并不意味着最好的结果,通常会带来很多噪点而不是合理的细节,并且“极高”的设定比起其他设置来说要花费多得多的时间来处理。我们在这个过程中大部分情况下都采用“高”的质量设置参数。

3. 构建模型

当你对得到的点云满意的时候,就可以开始构建模型了。有两种表面类型可供选择。闭合的物体,诸如岩石、树木等,应当使用“Arbitrary Surface Type”。开放的表面比如地表等,则使用“Height Field Surface Type”。

也可以根据需要调整多边形的面数。这里可能要根据电脑性能和其他软件来参考怎样的面数比较合适。在 2015 年前期,当 Epic 还在为 GDC 制作风筝演示的时候,ZBrush 只有 32 位的版本,当时想要输出超过一千五百万以上的面数就很困难。现在有了 64 位的 ZBrush 就让人很愉快。

4. 构建模型材质

构建材质则是另一个比较快的过程。只需要保证材质贴图足够大,能覆盖到所有的细节就行。首要原则是,先获取最大尺寸的材质,以后再修改它。 

由于从照片扫描所限,UV 会不太高效。在后续清理的过程中需要预期可能会损失一些数据。 

5. 保存/导出

最后,模型和贴图都已经完成并可以导出了。需要确保检查一下最终的结果是想要的文件类型。FBX 和 OBJ 格式对模型比较好。为了更好的去光化,选择 16 位的 TIFF 则能保留更多颜色的信息。

去光化

为了最大程度的利用虚幻 4 的 PBR 渲染效果,灯光的信息需要在处理的贴图中抽离。否则你得到的是一个已经具备光照信息和阴影信息的资源,当把它放到场景中时表现并不会正确。有一些贴图去光化的方法:第一个选择是使用 HDR/灰球-铬球的信息来重建 3D 空间的光照,其他选择都是使用 Photoshop 了。

使用 HDR/灰球-铬球

HRD/灰球-铬球方法的基本理论是在 3D 软件程序中重现同样的光照场景。先用 HRD 的图片照亮场景,利用灰球来得到匹配的亮度以及利用灰球来匹配角度。目标物体(在这个例子中目标物体是岩石)一定要有真实的大小才能得到准确的光照。所以需要提前测量物体,或者拍照时有参照物来得到大小信息。我们是利用灰球和铬球中间的距离来做大小参考。目标物体应该具有 20% 的灰度(大致上接近灰球的 18% 的灰度,也叫做灰度的中间值)才能正确的去除光照的信息。

一旦在 3D 程序软件中重现了光照场景后,下一步就是去掉场景中的模型上的光照信息。光照信息和原始的贴图数据结合起来便能获得去除光照后的贴图。这个计算方法类似于: 

原始贴图 / (烘培的光照信息 * 5) = 去除光照信息的贴图

如果按照上述这些步骤的话,去除光照的整个过程都不需要太多人工干预或清理。 

如果没有 HDR/灰球-黑球 肿么办

如果没有类似于灰球-铬球以及 HDR 这样的拍照辅助工具的话,有个简单的办法来对贴图去光化,就是在 Photoshop 中使用“高通”滤镜(High pass filter)。 

简单的将原图复制到一个新层,并应用合适的半径设置的高通滤镜。这个滤镜能对原帖图强化画面对比。应用了高通滤镜后,在重新和原图混合。对于不同的照片需要不同的混合模式和透明度设置。需要尝试不同的高通滤镜的半径参数以及混合方式来得到最佳效果。

下一篇文章

很高兴能看到社区中那么多人对照片的重建话题感兴趣。这篇教程是对照片重建过程的一个非常通用的工作方法,以及我在风筝演示的工作中学到的窍门。希望这些窍门对大家有帮助并能节省各位的时间。

在下一篇文章中,我们来看一下如何利用从照片扫描后得到的去光照信息的高精度模型来制作游戏可用的素材。敬请期待!