之前,我写过关于 实时 3D 扫描你周围的世界并在其中放置一个虚拟物体的文章;但是在本教程中,我想解释如何进行相反的操作,通过对自己进行 3D 扫描,然后将该扫描添加到虚拟世界中。
更具体地说,我们将:
使用实感摄像头和SDK扫描您的头部。
将 3D 文件从 OBJ 格式转换为 PLY 格式(用于在 blender 中编辑)。
将顶点颜色转换为 uv 纹理贴图。
编辑 3D 网格,使其具有较低的顶点和多边形数。
我们最终会得到一个 3D、彩色的头部网格,可以在 Unity 中使用。(在下一个教程中,我们将了解如何将其实际应用到 Unity 中,以及您可以在游戏中使用它。)
你会需要:
英特尔实感摄像头(或集成实感摄像头的计算机)
配备 Intel Core 4th gen 处理器(或更好)的计算机
realsense SDK(可免费下载)
MeshLab(免费)
搅拌机(免费)
扫描你的头
安装SDK后,转到 Charm Bar(在 Windows 8 中)或开始菜单(在 Windows 7 或 10 中)并搜索RealSense SDK Sample Browser
. 在列表中找到它,右键单击它,然后选择Run as Administrator。
在示例浏览器中,您将找到一个名为Common Samples的部分。这些示例适用于前置和后置 RealSense 摄像头。找到名为3D Scan (C++)的示例。
如何扫描你的头部
从示例浏览器的3D 扫描 (C++)部分中选择运行。
把你的头放在相机前面,你会在扫描仪的视野中看到它。保持不动,直到弹出第二个窗口。
一旦第二个窗口弹出,开始向一个方向(慢慢地)旋转,然后反向并尝试一直旋转。
一旦你完成了一个完整的循环,将头向后倾斜然后向前,然后保持不动。最后几秒。让你的眼睛在相机上方向前看,这样你的眼睛就可以固定在一个静止的位置。
扫描完成后,将打开一个浏览器,允许您拖动和旋转模型。
Documents
该模型将以3Dscan.obj
.您可以根据需要多次重新运行样本以获得满意的扫描结果。
扫描提示
该样本旨在跟踪空间中的刚性 3D 物体,因为它在相机前旋转。这意味着您可以从多个侧面对其进行扫描。
如果对象的一部分在旋转而另一部分静止,则会混淆跟踪算法,最终导致扫描失败。所以,在扫描头部时,不要只转动脖子来扫描;相反,旋转你的整个躯干。
您可以向前倾斜、向后倾斜、向左旋转、向右旋转和转身。通过练习,可以从各个角度扫描对象。
您应该在光线均匀的区域进行扫描。避免阴影和镜面反射,因为它们会被烘焙到您的 3D 纹理中。
转换为 PLY 格式
OBJ 格式是您从扫描中获得的默认格式。要在 Blender(以及后来的 Unity)中使用它,我们将使用名为MeshLab的免费工具将其转换为 PLY 格式。因此,如果您还没有,请下载、安装和运行 MeshLab 。
从文件菜单中,选择导入。找到3Dscan.obj
您在上一节中创建的文件。
导入对象后,它可能在它的一边。您可以左键单击对象底部并向上拖动以旋转对象并检查它。
您应该看到带有颜色纹理的网格。颜色信息存储为顶点颜色,这意味着每个顶点都使用 RGB 相机在扫描您的头部时获得的像素进行着色。
单击文件 > 将网格导出为。在出现的对话框中,从Files of type下拉列表中选择Stanford Polygon File Format (*.ply) :
将生成的 PLY 保存在您以后可以找到的地方。
将顶点颜色转换为 UV 纹理贴图
这里的想法是将 3D 文件导入 Blender,制作一个副本,清理副本,并将顶点颜色映射为新副本版本的 UV 贴图。
下载、安装并运行 Blender(如果您还没有的话)。
将对象导入 Blender
在 Blender 中创建一个新项目,选择Import > Stanford (.ply),然后选择您刚刚从 MeshLab 导出的 PLY 文件:
导入后,你会看到纹理是不可见的:
但是,如果您切换到纹理视图,您将看到来自扫描的 RGB 颜色现在映射到纹理模式:
使用此菜单切换到 纹理视图。
要正确查看颜色,请再次切换查看模式——这次切换到Material。在右侧面板上,选择材质图标,然后创建一个新材质。
在面板编辑器中,将Shading设置为Shadeless,然后在Options中,打开Vertex Color Paint。这成功地将顶点颜色设置为对象的材质。
现在,这对我们来说还不是一个可行的网格。如果我们要在游戏中使用它,它充满了漏洞,很粗糙,而且多边形数量比我们希望的要高得多。
我们需要创建一个可以清理的网格版本,但是将这个顶点颜色的纹理映射为 UV 贴图。该版本是我们将引入 Unity 的版本。
创建网格的副本
选择对象 > 复制对象并按Enter。不要移动鼠标。
接下来,选择Object > Move to Layer,然后选择当前图层右侧的正方形(顶行左起第二个正方形)。
转到资产浏览器并重命名您的网格。命名一个Original Mesh
和另一个Second Mesh
。这将帮助您区分它们。
减少重复的多边形数
选择第二个网格,选择相关层,然后将视图模式从Material切换到Solid。
然后,从右侧面板中,单击看起来像扳手的图标以添加修饰符。我们将减少这个网格的多边形数量并清理它。
选择工具 > 重新网格化。在此对话框中,将Oct Tree设置为介于7
和之间8
。将模式设置为平滑,然后打开平滑着色。这将导致您丢失材质映射:
单击应用。您现在有一个更清洁的 Mesh,您可以在其上应用顶点和 UV 贴图。
应用顶点和 UV 贴图
在第二个网格上进入编辑模式。单击选择 > 全选。
创建一个新窗口并将其设置为UV/图像编辑器模式以查看 UV 贴图。
在3D窗口中,选择Mesh > UV Unwrap > Smart UV Project。
在UV Map窗口中,选择New以创建纹理。关闭阿尔法。将纹理命名为您希望为最终模型提供的名称。
切换到对象 模式。您将看到一个黑色模型和一个黑色 UV 贴图。没关系!
现在通过Shift选择这两个图层- 单击它们以使它们都可见。
选择两个图层......您的视图窗格将如下所示。
在Asset Browser中,选择 Original Mesh。单击相机图标。
在Bake部分中,打开Selected to Active。确保Bake to Vertex Color已关闭。
在Scene部分,将Color Management设置为None。
在Asset菜单中,选择 Original Mesh。然后,按住Shift并选择第二个网格。(您必须按此顺序进行。)确保两个图层都可以通过眼睛和相机图标看到。
单击相机图标。在烘焙部分中,单击烘焙。
您现在应该有一个纹理映射。要看到这一点,请关闭第一层,因此您只能看到具有第二个网格的层。选择纹理视图,您将看到使用 UV 贴图纹理化的网格。
您会注意到图像填充网格缺失区域的一些奇怪之处:
您可以切换到纹理绘制模式来清理它们。您现在还可以切换到雕刻模式以填充缺失的区域,以及清理或向网格添加特征。
导出网格
清理完网格后,您可以准备导出它:
确保 UV 贴图与网格命名相同,并且与网格位于同一目录中。
转到UV Map 窗口,选择Image > Save As,然后导航到将保存网格的目录。
选择File > Export to .FBX,然后输入与 UV 贴图相同的名称。
你的模型就完成了!
结论
您已经在脑海中进行了扫描,减少了多边形数量,清理了模型,并将其导出为 3D 模型,以便在其他应用程序中使用。在以后的教程中,我们将把这个 3D 网格导入 Unity,并看看如何在游戏中使用它。
- 如何扫描你的头部
- 扫描提示
- 将对象导入 Blender
- 创建网格的副本
- 减少重复的多边形数
- 应用顶点和 UV 贴图
- 导出网格