VR环境之高级户外摄影与大场景建模

本文翻译自 Valve 开发者社区Advanced_Outdoors_Photogrammetry一文,原作者为Harborough Rocks, Derbyshire, UK作者、Valve 员工Cargo Cult,本文翻译由梓喵出没博客独立完成。

引言

目前大部分摄影测量教程的关注点都在单个物体上,而为数不多的关于大场景的教程通常都是室内等封闭区域。

本教程阐述了一个可行的工作流程,即数字化一个广阔的户外场景,使其在虚拟现实(VR)世界中拥有无尽的沉浸感——其内容包括更遥远的几何结构以及周围环绕的天空穹顶。尽管这篇教程面向高级用户(用户具有摄影、三维建模、纹理编辑等专业能力),但对于普通人来说,本教程仍可以帮助他们捕捉真实世界。

本教程简单介绍了 SteamVR Home 中的摄影测量内容,对于全面的 VR 摄影测量学概念,我建议阅读这些文章

我使用一组规模较小的照片集进行演示,这些照片是我在英国过圣诞节时拍摄的。当时正处于暴风雨的间隙中,我趁着为数不多的晴朗天气出去遛狗,顺便拍下了这组照片。

本工作流内容包含制作高细节的近景几何数据;低细节的中距离几何体数据;以及由投影照片制作的天空盒(远景)。演示照片的拍摄地是铁路旁的一个后工业地区,它虽然不是一个风景如画的旅游景点,但整个数字化过程与 SteamVR Home 中的火星、英国教堂等场景是相同的。

虽然本场景制作过程中涉及很多特定软件,但大部分想法和建议都是通用的,即使使用不同软件,这些东西也能派上用场。你可以试验一下,找到最适合你的工作方式。

拍摄照片与后期

我使用佳能 EOS 7D 搭配 EF-S 10-22mm 镜头拍摄,拍摄时镜头焦距为 10mm 广角端。相机设定为手动曝光,参数为 f/8,1/60s,iso 100。手动曝光是为了保证拍摄的照片具有一致的光照信息。照片保存格式为 RAW,以提供最优的后期处理能力。

在导出图片前,我们需要对图片进行一些后期处理,大部分基础的后处理使用 Lightroom 就可以完成。我做的后期处理包括调整合适的白平衡、调整阴影和高亮、修正色相差与镜头暗角。注意,所有照片应该使用相同的后期处理参数(以保证图像一致)。

8bit TIFF 图像可以直接使用,但由于传输网络的要求,我使用小尺寸的照片文件(转换成了 jpeg)。

近景

在 Reality Capture 中重建三维信息

我使用 Reality Capture 来生成高精度的前景 mesh,尽管软件的部分功能还在开发中,但它已经足够从照片中提取精细的几何细节了!我做了一个相机对齐,然后设置重建区域为相机位置附近所有区域。我做了一个普通精度的细节重建来测试之前的参数,然后进行高细节重建。重建完成后,整个重建模型大约有 7900 万个三角面,对于 VR 来说,这些面数太多了,可能无法正常渲染。同时我还做了一个Colorize(软件内功能,彩色重建)来生成顶点颜色,这是为了执行快速渲染来测试某些参数。

之后,我使用“Simplify Tool”工具对 mesh 减面,最终将模型面数减小到 175 万三角面。对于 VR 来说,300 万面是一个合理的最大值,而当前这个场景有限的大小及并不复杂的特点使我不需要那么多面。之后我使用Unwrap工具展 UV——本例中只有一个纹理贴图(不适合最终渲染,更适合效果展示),生成贴图后,我将它们分别导出为 OBJ 文件(模型)与 PNG 文件(贴图)。

两个小提示:

  1. 用旧版 Reality Capture 展 UV 时请确保之前没有已经存在的 UV 信息,不然替换时会出现问题,而新版软件修复了这个 bug。最大纹理数这个值作用不太大,最终纹理数的值有可能远小于该值。要在几何插值过程中获取足够的纹理信息,请确保Large triangle removal threshold设置的尽量高,我一般将这个值设置为 95 。
  2. 对于对比度特别大的场景(例如阴影接近纯黑高光接近纯白),可以在展开设置中增加Gutter size值来增加 UV 间隔,以减少因为 mip-map 导致的远距离贴图纹理交错现象。纹理交错可能产生奇怪的微弱闪光线或者阴影区的不明高光点。对于本例,我使用 8 像素的间隔。

在 MeshLab 中修复破面

从 Reality Capture 中导出的 Mesh 可能包含破洞、破面等,他们可能是几个小三角形,也有可能是肉眼可见的一整片区域。相对于手动修复来说,我更倾向于使用免费开源的MeshLab软件来自动修复,这款软件在处理超多多边形网格时非常好用。

我使用了这些过滤器(调整器):RemeshingSimplification以及Reconstruction : Close Holes,所有参数均为默认。

修补破面后,我将它重新保存为 OBJ 文件并使用 Modo 打开(你也可以使用其他 3d 模型编辑软件)。

在 3d 软件中清理 mesh

由于 Reality Capture 和 Modo(作者使用的 3d 软件)对于上方向的轴定义不同,我首先在 Modo 中调整了轴向。

RC 的 mesh 通常是封闭的,也就是说分割的每个 mesh 都是一个完整且具有体积的集合体。在 VR 场景渲染中,我们并不需要侧面和底下的面,因此最初的清理工作是删掉这些面。

我一直在努力删除不必要的几何图形,并填充MeshLab未修复的偶尔可见的破面及坑洞,至于不可见的部分我们无需处理,之后我们将 OBJ 倒回到 RC 中。

由于 RC 对于导入的 OBJ 文件有很苛刻的条件,因此我重置了定位器上的旋转,从Modo的“列表”选项卡中删除了网格的 UV 和曲面法线,将所有面的材质绑定为单个材质,并将平滑角度设置为180°,然后将模型导出为新的 OBJ 文件 。(最新版 RC 似乎修复了大多数 OBJ 文件导入问题,网格 UV 和平滑角度等不再需要特意调整)

导入到 RC 后,我再次使用Unwrap工具(最大纹理设置为 10)重新生成纹理,然后再次导出网格。我在 Modo 与 RC 间导入导出过多次,直到近景的几何形状与纹理让我满意为止。

中景

使用 PhotoScan 重建三维信息

对于 VR 中完整的场景来说,提高沉浸感的关键是让场景完全包围玩家——不管是几何体还是远处的贴图天空盒。对于某些场景,仅仅使用近景几何体和一个天空和就够了,而对于其他场景,中等距离上的低精度低细节的几何体也是不可缺少的。一个 alpha 通道可以让中等距离的几何体贴图混合到天空盒中,这样用户就很难看出模型与天空盒的交界(提高沉浸感)。

中景的处理阶段我使用Agisoft PhotoScan进行操作,因为在后面的过程中我需要根据相机的位置来创建天空盒纹理,而 PhotoScan 的工作流更有利于进行单摄像头纹理投影。

PhotoScan 的操作过程与 RC 操作差不多,我添加了 Lightroom 导出的所有照片,生成了稀疏点云(在执行相机优化之前,我删掉了一些错位和不明所以的点),之后生成了一个低细节密集点云。

低细节点云在天空和地面以下有许多不必要的点,因此在生成 mesh 前,我手动删掉了许多不必要的点。

提示:

  1. PhotoScan 中的Dense Cloud :: Select Points by Color工具非常实用,尤其是当我们清理天空中的点时。调整一下参数(色调与饱和度加上淡蓝色),你就能删掉一大堆不需要的点。使用这个工具进行清理工作,结果非常整洁。

最终的结果可能是一团一团的混乱物体,非常奇怪。不要担心,这是正常的,因为我们的目的只是创建一些基本的几何体来进行纹理映射,从而得到远景的纹理比例和视差。之后我成生了一张纹理贴图(全新生成,重新展 UV 并使用一张 8k 贴图),之后将模型以 OBJ 形式导出,方便使用 Modo 编辑。这里要特别说明,纹理只是为了视觉展示,而不是要特地保留某些信息,因此我后面很快就丢弃了这些内容。

我删除了远处没有连接的区块,然后尽可能去掉(自动生成的)蓝天几何体信息。在天空和地面之间有一个三角形区域,我保留了它,以便接下来在天空盒贴图上使用 alpha 通道来制作一个漂亮的边缘过渡效果。

自动生成的工厂区网格细看非常糟糕,我其实可以创建一些简单的低多边形建筑(来替换它们),但我想展示的是,自动生成的远处几何体有多糟糕,当然,单摄像机纹理投影仍然有效。在这里我唯一增加的几何体是一个简单圆柱体,用来当作烟囱。玩家移动时,这个烟囱可以让玩家更有沉浸感。

合并几何体(mesh)

我们使用 RC 和 PhotoScan 生成了两个单独的网格,虽然它们描绘了一些相同的区域,并且使用相同的数据构建,但是它们的比例和旋转等都有很大的不同。高精度的近景 mesh 和低精度的中景 mesh 需要对齐,才能在 VR 中显得真实而不穿帮。我使用 3d 软件导入了近景网格,并仔细调整了比例、位置和旋转,直到它与中景的低细节几何体匹配。我删除了两者重叠的区域,并添加了一个微妙且没有间隙的过渡(即连接顶点等),二者连接的边界略微扭曲,但无伤大雅。

删除了多余天空和顶点的中距离网格显得非常干净,我将特别远的边缘部分向外略微移动,并使用一些平面填充孔洞。远处 UV 有一些重叠,我稍微调整了一下,增加了这些 UV 贴图所占的面积。

提示:
1. 注意重建网格中的“气泡”和空洞会导致UV密度过大或重叠等问题。删除有问题的部分并修补产生的孔,或者为这些部分单独展 UV。
2. 导出在 SteamVR Home 中使用的模型时,请确保所有指定材质的“面平滑”都为最大值,且没有额外的顶点法线设置。虽然不调整也可以正常导入 SteamVR Home,但处理它们可能需要更长的时间(而导致卡顿等)。

天空盒(天穹)

不可缺少的天穹形状

对于场景中物体布局,我有一个很好的想法。我打算创建一个天空穹顶来笼罩整个场景,并给这个天空穹顶贴上等比例的投影照片。

天空穹顶是一个围绕整个场景的简单球体,我切掉了球体底部约三分之一的 mesh,从而得到了一个比普通半球稍大的半球体。我将这个半球体的 UV 展到一个平面上,然后略微调整了 UV,使贴图产生了鱼眼效果,从边缘到中心,贴图一直向上延伸。不要着急,我们所需的图像数据会在后续步骤中生成。

由于我们使用的是无缝的圆形纹理,因此在编辑边缘时可能稍微有些别扭(地平线是弯曲的),但这种 UV 分法让编辑天空本身的过程变得简单。使用这种分法,我们很容易在 Photoshop 中用克隆和渐变工具填充天空缺失的部分。

提示:
1. 在导出为 OBJ 或 FBX 之前,我们最好将基于四边形的几何体转换为三角形,因为不同的软件可能对四边形三角切分有不同的处理过程。例如,将未做三角形转换的模型导入到 SteamVR Workshop 工具时,天空纹理中会出现轻微的波浪线。因此,在导出模型时,务必将其面转化为三角面,以保证在不同软件中几何体一致。

在 PhotoScan 中生成初始天空贴图

对于这个步骤,我已经做好了大部分准备工作:我给中距离模型分配了一个材质,而为天空穹顶分配了另一个材质;我还复制了前景模型的材质以及平面投影 UV,当然,它的意义只是为了防止摄像机将不需要的部分投射到远处的模型(azimiao.com)上。(另一个方法是使用之前预先存在的材质,但将废弃部分的 UV 压缩到一个不相关的小角落。或者,网格和材质可以保持原样,但是生成更多纹理时会有计算成本,而这些纹理是不必要的)

我重置了模型旋转,并删除了不不要的部分,之后将组合体网格导出为 OBJ,以便在 PhotoScan 中进行纹理处理。

我们的纹理虽然适合近距离的物体,但对于较远区域来说,这些纹理却显得模糊,阴暗,甚至重叠。因此,我们需要使用不同的技术来处理它们。

单摄像机投影

现在我有了一个很好的操作基础,我在 Modo 中重新分配纹理以便使用新生成的纹理,同时我将场景(天空盒、中距离几何体和前景几何体)导出到一个 FBX 中,以便将它导入到 SteamVR Home 里。我把它们放到一个基础(梓喵出没azimiao.com翻译)的地图中,按比例粗略缩放了网格,这样就可以开始处理纹理工作了。纹理工作主要包含为中距离模型和天空盒创建新的 PSD 贴图,并在Material Editor中重新分配材质。

回到 PhotoScan 中,我禁用了所有摄像机,除了一个指向合适方向的摄像机:这个摄像机指向水库和风力涡轮机。之后,我再次重建纹理,并将纹理导出为 PNG,然后将新的超清晰纹理用于天穹和中距离几何体,并在 Photoshop 中将它们仔细混合在一起。

调整相机位置,重复操作过程,不断生成天空盒和中景贴图。将新生成的贴图导入 PS 处理并保存,Hammer 中会自动更新视图。在 VR 中测试,你会发现某些区域需要更精细的调整,同时你也会发现一些屏幕上看起来非常糟糕的部分在 VR 里显得还不错。

半透明混合

为了将中距离几何体混合到天穹中,我添加了第二个纹理以便在Material Editor中用作半透明。我使用 PhotoScan 最初导出的第一个纹理的 alpha 通道,并仔细地进行裁切、模糊等编辑,使它能够给几何图形提供正确的自适应边缘。工厂的建筑被仔细地用锐利的边缘勾勒出来,而原野的一部分被淡出以隐藏一个可见的过渡。我在这上面花了大量时间,因为它对提升场景效果有非常大的作用。

为了更好地对透明层进行排序,我在Modo中复制了中距离 mesh,使其与原始副本完全对齐,并为其分配了另一种材质,之后将它重新导入到 SteamVR Workshop Tools 中。我修改了材质以使用 PSD 贴图,这意味着我可以为中距离几何体设置第二种材质。这次我将材质设置为’Alpha Test’而不是’Translucent’,且 Alpha Test Reference’设置得相当高,以将硬边缘隐藏在半透明层中。虽然网格的模糊边缘可能导致渲染错误,但它远不如不透明部分明显。(我还在英国教堂场景中的树木和其他树叶上使用了这个技巧,出奇地有效)

真实世界缩放

为了获得精确的缩放比例,可以借助谷歌地球中的测量工具测量地标间的距离,之后按比例缩放模型。

如果你的扫描场景在地图上不可见(例如在室内、地下等),你可以使用任何已知的长度来确定缩放比例。

完成场景的收尾工作

烘焙到世界

在导入模型并放置在 Hammer 地图上之后,我在对象属性中选中了Bake to World。在地图编辑室,大的 mesh 将会被分割成更小的部分,这样计算机渲染压力较低。

灯光

有关场景中存在的动态灯光对象的完整描述,请参见同样以该地图为例的摄影测量场景照明设置教程。

实体

除了上面说的光照实体之外,我还添加了一个出生点和一些盘旋的乌鸦。

在最近的更新中,我开启了平行光阴影,并将所有地形材质设置为接收但不投射阴影,以防止自阴影瑕疵。这样设置的目的是为了让玩家化身和道具显得更真实(有影子)。我还添加了一个简单的传送区域网格,让玩家可以自由漫游。

最终场景

我已经将场景上传到 Workshop 中,如果你有任何疑问,请随时在此处或 SteamVR 社区站点的“讨论”选项卡中提问。

本博后记

翻译了整整三个晚上,终于将这篇 VR 大空间扫描建模教程翻译完毕。本教程由 V 社官方员工撰写,对于想了解大空间扫描建模的同学来说是一份非常好的入门材料。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/7427.html
欢迎加入梓喵出没博客交流群:313732000

发表评论

*

*