使用智能手机的相机进行简单并且免费的摄影测绘(扫描建模)

转载翻译自?

ArtStation - Easy and FREE Photogrammetry with a smartphone camera?

https://www.artstation.com/blogs/shab42/E6We/easy-and-free-photogrammetry-with-a-smartphone-camera

摄影测绘或者说通过扫描真实物体进行建模的这种方式变得越来越容易,但通常需要高质量的摄影设备和昂贵的软件。有一些移动摄影测量应用程序,但通常它们无法创建高质量的资产(在此对 Reality Scan 寄予厚望)。

??但是,如果你对这方面有兴趣并且想尝试一下,看看它的步骤以及它是如何实现的,而且不想花太多钱在这上面,该怎么办?我制作本指南是为了帮助你创建简单且完全免费的摄影测绘资产,以便导入到游戏项目中。你只需要一部带有摄像头的智能手机和一台能够处理所需数据的 PC。(有支持 CUDA 的 GPU 是最好的,但这并不是必须的)。

选择一个对象并按照以下步骤制作一个干净并且为游戏准备就绪(Game-Ready)的 3D 模型。我会建议一些不太小的东西,因为智能手机不是很擅长宏大的东西。?大约 1x1 米就可以了。

从拍摄真实物体的照片到制作一个干净并且为游戏准备就绪(Game-Ready)的 3D 模型

?由于这是使用智能手机进行简单快速(和免费)扫描的一般概述,因此我不会过多地介绍拍摄设置的细节。通常情况下,你需要购买一些用于校准的色卡和其他照明/阴影相关的设备,以及一台专业相机,但在这里我们只会使用智能手机。?


所以,关于拍摄的关键建议有:?


?- 尝试在阴天拍摄或着想办法遮起来被摄物体,让它避免受到阳光直射。尽可能地避免过亮的区域和投射出来的阴影。理想情况下,在最终的反照率纹理贴图上不应该有任何阴影,因为阴影将由你最终导入模型的游戏或渲染引擎生成。在生成高模的过程中,投射出来的阴影和高光也可能导致错误和意外的结果。

尝试在阴天拍摄或着想办法遮起来被摄物体,让它避免受到阳光直射

- 拍摄时画面要有重叠的部分。在拍摄下一张照片时,要将前一张照片的一些区域保留在画面内。因为生成模型的程序会根据照片上的高对比度区域以及它们从上一张照片到下一张照片的移动情况来分析形状。如果你拍摄的照片离物体太近,以至于没有任何相似的部分,就不可能在 3D 中重新创建网格。我建议在物体周围 360 度小心地移动,保持整个物体在一个框架内,然后逐渐靠近,拍摄更困难和复杂的区域,比如小孔或者图案。一般来说,要尽量从各个角度覆盖物体的所有部分。

拍摄时画面要有重叠的部分

- 锁定你的曝光(如果你的智能手机的相机允许的话)。大多数智能手机的相机都是实时自动调整照明相关的参数的。这可能会导致一个问题,不同的照片会有不同的亮度水平,因此导致物体表面的颜色产生差异。通常情况下,当你靠近一个物体时,曝光会增加,因为通过镜头的光线较少,智能手机会试图补偿它。注意观察,尽量不要离物体太近,避免将相机对准天空,或者锁定你的曝光等级。如果天气变化,太阳出来了,最好等待它再次躲在云层后面(如果可能的话),然后再继续。

- 尽可能地设置最大的照片分辨率。你能得到的像素越多,最终纹理上的细节就越多。请注意,这将增加文件的大小,所以在你的智能手机的内存中保持足够的可用空间。

- 给你的相机足够的时间来进行对焦。拍照时不要匆忙。拍照时要停下来,保持不动,避免模糊。模糊的照片会破坏掉整个过程并且会毁掉纹理的细节。

- 将高质量的照片传输到你的电脑。你需要找到一种方法,以原始质量传输照片。这听起来很理所当然,但有时候并不那么容易做到。使用一些中转软件传输照片会影响质量。(例如,将照片作为文件上传到 Google Drive,然后在电脑上下载,比使用 Google Photos 要好。Google Photos 会为了更快地上传到云端而降低图片的质量)。请注意这一点。

我将使用 AliceVision Meshroom 来建立最初的高多边形的模型和纹理。Meshroom 是免费的,并且能够计算过程中所有的关键步骤:

* 对齐照片

* 建立点云

* 构建网格和纹理

你可以在这里下载它:

https://alicevision.org/#meshroom

AliceVision Meshroom

首先要做的是将所有的照片导入 Meshroom,只需将它们拖入左边的区域。然后在底部你应该可以看到代表高模生成的关键步骤的节点链。程序会从左至右逐一运行节点。每个节点都有自己的设置,我们最好在开始之前增加一些数值。

将所有的照片导入 Meshroom

为了保持步骤简单,大多数节点可以保留默认的设置,

除了最后 3 个节点:

1.我发现如果我在 [MESHING(生成网格)] 节点中增加更多的点,最终的网格看起来会更好。

Max Input Points(入的的最大值)=100000000, Max Points(点的最大值): 10000000

Max Input Points(输入的点的最大值)=100000000, Max Points(点的最大值): 10000000

2.在 [MeshFiltering(网格过滤)] 节点中,我设置了两倍的?Smoothing Iterations(平滑迭代次数)(10 次,而不是默认的 5 次)。

设置 Smoothing Iterations 的值为 10 次,而不是默认的 5 次

3.最后,我在 [TEXTURING(生成纹理)] 节点中为输出纹理设置了更大的分辨率。

Texture Side:16384,Texture Downscale:1

Texture Side:16384,Texture Downscale:1

现在,我们可以准备点击顶部的 "Start(开始)" 按钮,让它一个一个地计算所有的节点。注意一下上面的进度条,整个过程可能会比较漫长,这取决于照片的质量和数量,取决于节点的设置,显然还取决于电脑的配置。对我来说,这通常需要 15 分钟到几个小时。

你可以随时点击顶部的 "Stop(停止)" 按钮,保存你的项目(以及到目前为止的进展)并在以后返回。下次它将从最后计算的(绿色的)节点继续计算。

在右边,你可以看到正在创建的 "Point Cloud(点云)" 和它周围的摄像机——它们显示了所拍摄的每个镜头的位置,并与对应的照片相联系。

正在创建的 "Point Cloud(点云)" 和它周围的摄像机

在处理完成后,你可以在你保存的 Meshroom 场景文件旁边的 [MeshroomCache] 文件夹下的 [Texturing] 文件夹中找到高模的 high-poly .OBJ 模型和纹理的文件。

[MeshroomCache] 文件夹下的 [Texturing] 文件夹

最初的高模已经做完了!你已经可以把它导入任何三维软件(注意,在这个阶段它是极度缺乏优化的),并给它应用纹理。

但是如果要在游戏中使用它或者要使其更加优化,你需要完成更多的步骤,首先是进行网格重构,重新拓扑以降低多边形的数量。

大多数专业的 3D 软件都能够以任何方式对模型进行重新网格化,但如果要免费实现这一步骤,我建议使用 Instant Meshes 。

这是一个免费的开源程序,你可以从 Github 这里下载:

https://github.com/wjakob/instant-meshes

Github 上的免费的开源程序 Instant Meshes

安装和运行程序本身是非常简单的。

- 只要打开高模的网格

- 设置目标顶点数量(我建议对当前这样的资产设置 30-60 k。这显然超过了游戏行业的标准,但它仍然比原始模型少 10 倍,而且也不会失去任何细节。如果你将最终模型用于渲染或原型设计,肯定会有帮助)

- 选择?Solve(解算)?,然后选择?Export mesh(导出网格)。

非常易于使用的程序

现在你有了新的、优化过的网格和旧的纹理。新的网格还没有 UV ,所以我们需要创建它,然后将旧的纹理转移到新的 UV 上。

Blender 的几个插件可以帮助我们做到这一点。它也是完全免费的:

https://www.blender.org/download/


!请记住,你目前还不应该以任何方式旋转、缩放、移动和定位你的模型。让它们保持原样,以后会有时间来改变变换和旋转。


- 安装 Blender 并打开它,将新优化的模型导入其中。你现在可以删除不必要的多边形(地面或周围环境)。按 Tab 键启用编辑模式,然后按字母区的数字?3 键选择面模式,选择你想删除的东西(如果你需要选择更多,按住 Shift 键可以加选),然后按 X 键,选择面。当你完成后,再次按下 Tab 键,退出编辑模式。

- 左键单击模型,然后右键单击并从菜单中选择 "平滑着色"。

- 在界面顶部切换到?UV Editing 工作区。将鼠标悬停在右侧窗口中的模型上,按字母区的数字?3 键切换到面模式,按 A 键选择模型的所有面。然后右击并选择 UV 展开面 -> 智能 UV 投射 -> 确定。这将为优化后的模型制作新的 UV 并将其打包。同样的,这可能并不是展开你的模型的 UV 的最理想的方法,但它是免费的,快速的和简单的,而且它是有效的。

展开你的模型的 UV


现在,你已经为你的模型展开了新的 UV,接下来你需要从高模上烘焙法线贴图和反照率贴图。

我建议使用 Blender 的 BakeLab 插件,因为它可以在 Blender 内部实现它所有的功能,而且它是免费的。

- 从 Github 下载 BakeLab

https://github.com/Shahzod114/Blender-BakeLab2

- 在 Blender 中按 "编辑" -> "偏好设置" -> "插件" -> "安装" -> 选择下载的 .zip 文件。然后在出现的插件列表中选中打开它。

- 现在在 Blender 中按下 N 键,右边应该会弹出一个侧边菜单,其中会有 BakeLab ,选择它。

从 Github 下载 BakeLab

- 从 Meshroom 导入旧的高模到 Blender(这可能需要一些时间)。

- 进入顶部的 Shading 工作区,选择这个模型,并确保它有一个材质,如果没有,就创建一个。(如果没有材质,就按底部的着色器编辑器面板中插槽 1?附近的 + 号)。

- 添加 [Image Texture(图像纹理)] 节点并将其与你的材质节点的 [Base Color(基础色)] 连接。

- 在 [Image Texture(图像纹理)] 节点上按下文件夹形状的符号,打开你从 Meshroom 中得到的初始高模的纹理。

- 纹理现在应该出现在你的高模上了。现在我们需要在 BakeLab 插件的帮助下将其转移到我们新的优化过的模型上。

纹理现在应该出现在你的高模上了

- 在 BakeLab 的面板中,按下在 Map 下面的 + 键,选择 Albedo(反照率),再按 + 键,选择 Normal(法线)。确保它们都被选中。

- 设置图像分辨率如下。宽度 4096 ,高度 4096 。你可以在这里使用任何其他 2 次方的分辨率(2048 x?2048,1024 x 1024,8192 x 8192,等等)。

- 现在,在右上角的大纲视图里:

1.选择你从?Meshroom?中制作的那个高模,就是我们应用了纹理的那个。

2.按住 Shift 键。

3.选择你优化过的新的模型。

4.松开 Shift ,按下 BakeLab 中的 Bake 按钮。稍微等一下。

- 现在你已经为新优化的模型的 UV 烘焙好了反照率纹理和法线纹理。它们可能还没有应用到优化后的模型上,你需要手动应用它们:

1.选择优化后的模型,移动到?Shading 工作区,检查它是否有材质,如果没有,就创建一个。添加 [Image Texture(图像纹理)] 节点并将其与材质的节点中的 Base Color 连接。

2.在?[Image Texture(图像纹理)]?节点上按 “?+ 新建”,设置分辨率(与你在 BakeLab 中设置的相同)。

3.现在按下?[Image Texture(图像纹理)]?节点左上角的第一个小图标,从列表中选择新烘焙的 Base Color(基础色)纹理。


现在,你已经使用新的 UV 将旧的反照率贴图转移到了新的模型上。现在对法线贴图做同样的处理(它已经被烘焙过了)。

- 添加另一个?[Image Texture(图像纹理)]?节点,按?+ New,设置分辨率(与你在 BakeLab 中设置的相同)。按下?[Image Texture(图像纹理)]?节点左上角的第一个小图标,从列表中选择新的已烘焙的法线纹理(Normal?texture)

- 要把它连接到材质上,你需要创建 [Normal Map(法线贴图)] 节点并把它连接到材质节点的?Normal(法向)上。现在将?[Image Texture(图像纹理)]?节点插入到 [Normal Map(法线贴图)] 节点的?Color(颜色)中。确保你在?[Normal Map(法线贴图)]?节点上选择了?Tangent Space(切向空间)

应用新的法线纹理贴图(OpenGL)

现在你新优化的模型看起来应该和 Meshroom 中的原始高模一样。反照率是一样的,而法线贴图增加了一些缺失的细节。

如果你现在发现有奇怪的效果,比如模型看起来太有光泽或者有奇怪的颜色,或者阴影不正确,试着反转你的法线贴图绿色通道。要做到这一点,你可以在?[Image Texture(图像纹理)]?和?[Normal Map(法线贴图)]?节点之间添加 3 个节点,如下图所示。这将有助于?[Separate RGB(分离RGB)]?到3个通道, [Invert(反转)] 绿色通道,然后在?[Combine RGB(合并RGB)] 时使用反转过的绿色通道。这可能有助于修复法线贴图和整体的外观。只有在你觉得有些东西看起来不对的时候才这样做,一般来说你不需要添加这3个节点。

如果出现上述问题,可以这样修改法线贴图(DirectX)

现在我们有了优化的模型,有了可以承受得起的多边形数量和足够的细节,可以在任何你想使用的地方使用它。


!这是正确旋转我们的新模型、定位它、为最终外观正确缩放它和应用变换之类的最佳时机。使用真实世界的比例肯定是一个好主意。特别是如果你以后要对它应用一些程序性纹理的话。


另外,还有一种不花钱的方法可以改善现在的反照率纹理,使用 Agisoft 的免费软件 Texture De-Lighter?

在这里下载它:

https://www.agisoft.com/downloads/installer/?

请注意,只有 Texture De-Lighter 是免费的。

只有 Texture De-Lighter 是免费的

这个软件将帮助我们消除纹理上不必要的阴影和暗部。一般来说,有两种类型的阴影可以被去除:?Ambient Occlusion(环境光遮蔽)和 Cast Shadows(投射阴影)。

首先,你需要把模型导入到 Texture De-Lighter?

- 从 Blender 导出新优化的模型,需要导出为带有纹理的 .obj 文件。(重要的是,你同时也要导出 .mtl 文件。)

- 从 Blender 导出新烘焙的 Albedo/BaseColor Texture(反照率/基础色纹理)到你导出 .obj 文件的同一文件夹中。

- 将你的 .obj 文件导入到 Texture De-Lighter


* 要消除 AO(环境光遮蔽),你只需要在右侧面板的底部点击?Remove Shading(删除阴影)。然后等待。由于我们的源照片是用智能手机拍摄的,所以没有必要在这里进行过多的细节和设置。

计算完成后,你会在视口和左边的工作区列表中看到结果。

你可以随时在左边的工作区列表中双击未处理的图片和没有 AO 的图片之间进行切换。

消除 AO(环境光遮蔽)

* 要消除?Cast Shadows(投射阴影),你需要首先在模型上标记阴影和高光。

- 切换到未处理的三维模型

- 选择画笔工具和蓝色的调色板图标。你可以使用调色板附近的滑块来调整画笔大小。

- 用蓝色画出投射阴影的最暗的黑色区域。

- 然后切换到黄色调色板,用黄色涂抹过亮的高光点。要精确,覆盖所有的重点区域。

- 点击右边的?Remove Cast Shadows(移除投射阴影)按钮并等待。

现在在左边的工作区列表中,你应该有 1)原始模型2)没有AO的模型3)没有投射阴影的模型。在工作区列表中的相应项目上点击右键,然后点击?Export(导出),就可以导出纹理。

消除 Cast Shadows(投射阴影)

对于这个快速而简单的指南来说,我建议可以把这些经过去光处理过的纹理,将它们叠加混合,以获得更好的效果。

你可以直接在 Blender 中这样做(或者你可以使用任何免费的 2D 编辑器,比如 Gimp )。

- 转到你的优化过的模型的材质。创建2个新的?[Image Texture(图像纹理)]?节点。

- 在一个节点中加载没有 AO 的纹理,在另一个节点中加载没有投射阴影的纹理

- 添加 [Mix(混合)] 节点。将一个?[Image Texture(图像纹理)]?与?[Mix(混合)]?节点的Color 1(颜色 1)连接,另一个与?Color 2(颜色 2)连接。设置?Fac(系数)=0.5?或其他你认为更好的值,将其插入材质节点的 Base Color(基础色)。你可以重复这个步骤,并将这个结果与你之前烘焙过的纹理混合(在另一个?[Mix(混合)]?节点的帮助下)。这是为了防止去光的纹理的效果太过强烈,以至于破坏了一些细节。

使用 [Mix(混合)] 节点可以随时调节添加的纹理的强度

马上就完成了!现在设置适当的?Roughness(粗糙度)和?Specular(高光值)来更好地表现石头的表面。

如果你需要一些变化,有一个简单的技巧可以在 Blender 内部添加:

- 添加 [RGB] 节点,并把它的灰度颜色设置为接近白色(越白越粗糙)。

- 添加 [Hue Saturation Value(色相/饱和度/明度)] 并将你的反照率/基础色纹理连接到?Color(颜色)上。然后将饱和度设置为0。

- 添加?[Mix(混合)]?节点,在其中选择?Overlay(叠加)模式,将?[RGB]?节点连接到?Color 1(颜色 1)上,将?[Hue Saturation Value(色相/饱和度/明度)]?节点连接到?Color 2(颜色 2)上。将?Fac(系数)设置为 0.5 - 0.8 之间。这将为你的粗糙度增加一些变化。在这种情况下,深色区域将更有光泽,白色区域将更粗糙,要想反过来改变,你可以在连接到Color 2(颜色 2)的?[Hue Saturation Value(色相/饱和度/明度)]?和?[Mix(混合)]?节点之间添加一个[Invert(反转)] 节点。

使用 [RGB] 节点和处理过的反照率纹理一起影响粗糙度

我建议做的另一件事是使这个资产的底部变暗一点。这将有助于强调十字架,并使下面的部分与地面更加融合一些。

- 添加一个 [Geometry(几何数据)] 节点来访问对象的?Position(位置)

- 添加?[Vector Rotate(矢量旋转)]?节点并将?[Geometry(几何数据)]?中的?Position(位置)连接到它的 Vector(矢量)参数上。在?[Vector Rotate(矢量旋转)]?中选择?Y?axis(Y轴)。设置成与下面截图中相同的值:-0.4,-2.0,0.0,Angle(角度)90。

- 添加 [Bright Contrast(亮度/对比度)] 节点并将?[Vector Rotate(矢量旋转)]?中的?Vector(矢量)连接到它上面。将?Contrast(对比度)降低一点(到 -0.2)。

- 添加 [Gradient Texture(渐变纹理)] 节点。连在?[Bright Contrast(亮度/对比度)]?节点后面。

- 添加?[Mix(混合)]?节点。改变模式为?Multiply(正片叠底/相乘)。将?[Gradient Texture(渐变纹理)]?连接在在 Color 2(颜色 2)上,将你的反照率/基础色纹理连接在 Color 1(颜色 1)上。将这个?[Mix(混合)]?节点连接到你的材质节点的基础色上,然后就会有底部变暗的效果了。你可以通过调整?[Vector Rotate(矢量旋转)]?和?[Bright Contrast(亮度/对比度)] 的值来改变变暗区域的位置。

将几何体的某一方向上的渐变效果叠加到原始的纹理上

这就是全部了!使用免费的工具通过摄影测绘(扫描建模)创建的为游戏准备就绪(原型准备就绪)的 3D 模型。希望这个指南对那些想尝试用智能手机做一些基本摄影测量的人有些帮助。如果你对工作流程有任何疑问或者需要指导,请告诉我,我很乐意帮助你!

最终结果

P.S. 我实际上忍不住要把这个模型导入到虚幻引擎 5 了,看看它看起来如何 :D,它确实还需要一些额外的纹理和 PBR 验证,但对于智能手机的扫描来说,我认为看起来很不错。在 UE 的自动 LOD 的帮助下,确实可能可以在游戏项目中使用它。

在虚幻引擎 5 中的实际效果

Ancient Celtic Cross Grave Stone Photogrammetry Tutorial with a smartphone. Unreal Engine 5?使用智能手机创建古代凯尔特人十字架墓石的摄影测量教程 虚幻引擎5

https://www.youtube.com/watch?v=hGAs1KNbi0Q

如果你想仔细看看这个特殊的资产,

你可以在这里找到它:

https://artstn.co/m/AaxL2

它已准备好用于UE5。


谢谢你!


Copyright © 2014-2022 杏宇建材展销服务站 版权所有 Powered by EyouCms   网站备案号:粤ICP备5461231号

平台注册入口