接着上篇文章的创建一个简单的AR安卓程序,这次来创建一个自己的AR换脸程序。同样使用之前的项目,在Assets的Scene文件夹下使用Ctrl+N新建一个Scene(或者File→New Scene),选择AR场景,点击Create创建:
这样,就可以直接在配置好AR环境的AR Scene中添加自己的模型了,使用Ctrl+S保存该场景并为其命名。
zip下载位置在此,点击即可下载。
下载完成解压后,即可将BasicFaceFilterAssets.unitypackage导入工程的Assets文件夹下。
导入方法:
菜单栏选择Assets → Import Package → Custom package,接着选择刚才zip文件解压的文件夹位置,找到其中的unitypackage,双击后会跳出一个导入资源的窗口,点击右下角的Import导入。
由于要制作一个换脸程序,那么首先需要实现面部追踪。这部分工作官方已经做好了,我们只需要添加到场景中并在程序中可视化。这里使用到AR Default Face来追踪面部,因此,需要将AR Default Face做成预制体。当摄像机识别到面部时,该预制体被激活。为了可视化面部捕捉,需要为AR Default Face预制体添加一个材质。
在Hierarchy面板中右键选择XR → AR Default Face 为场景添加一个 AR Default Face 物体:
由于该项目是URP管线,因此需要确保AR Default Face物体的材质有效。在Assets下找到_BasicFaceFilter → Materials,并将Materials下的Face Debug MAT材质拖拽至AR Default Face物体的Inspector中:
将处理好的AR Default Face物体做成预制体放到Assets → _BasicFaceFilter → Prefabs下:
这一步中,我们将使用AR Face Manager来告知AR Session Origin,当检测到面部时,脸上将会显示什么特效。
将Hierarchy中的Cube物体删除,它只是用于测试的。
选中AR Session Origin物体,在其Inspector窗口中搜索并添加AR Face Manager组件:
AR Face Manager组件用于增删改代表面部的GameObject。
在Hierarchy中删掉AR Face Manager预制体,因为我们只想它在实际检测到人脸时再显示。
之前的正方体旋转AR程序用到的是手机的后置摄像头,而脸部特效AR程序需要使用到的是手机的前置摄像头。
菜单栏File → Build Settings,将AR脸部特效场景添加至Scenes In Build中,项目配置参考上篇文章的第3.2节。
手机打开该程序,可以发现脸上被覆盖了绿色的材质。
另一种方式是新建一个材质,也可以复制之前的绿色材质,在其之上再做修改。
可修改的参数还包括Metallic Map、Smoothness以及Emission:
由于之前的调试中AR Default Face物体被制作成预制体,只有当程序运行起来并检测到人脸时才会显示。因此为了方便添加我们自定义的纹理,这里使用Face_Reference_Mesh模型将人脸可视化,它将作为面部参考网格,用于可视纹理、配饰以及特效等。
材质的透明度是由其Alpha通道决定的。Alpha图是用于控制材质透明度的灰度图,越深的像素点透明度越高,反之越浅的像素点透明度越低。
由于Alpha图只使用灰度值,它们包含在一个通道中。Unity中使用Base Map图像的Alpha通道的灰度值来控制透明度。
如果想自己设计纹理,那么可以在这里下载psd贴图文件使用PhotoShop或者Gimp(Photoshop的开源替代品,可用于图像的创建、修改以及导出)来对其进行编辑。
需将新建的材质应用到AR Default Face 预制体,才能在运行时检测到人脸显示上述效果:
2.在Hierarchy窗口中隐藏Face_Reference_Mesh物体。
注意在Player Settings面板中修改一下程序迭代的版本号,打包项目上机测试,可以观察到当检测到人脸时,水纹面具覆盖在你的脸上。
图像优化对AR体验至关重要,因为移动设备的处理能力有限。当涉及到为AR创建纹理时,需要考虑到图像的大小、图像的类型以及纹理是否需要有透明度。
图像的纹理尺寸大小通常是用2的幂次数来表示的,如512 x 512, 1024 x 1024, 2048 x 2048 (2K) and 4096 x 4096 (4K)。较老旧的显卡需要固定是2的幂次数尺寸才能运行良好,大多新的显卡已然没有这个限制,但使用2的幂次数大小的尺寸仍被认为是最佳的做法。
图像的类型对于优化也有较大的影响。需要考虑到如下的因素:
对于不同类型的图像,它们各有优劣,我们应当考虑最适合我们的策略:
我们可以观察到在Assets 中的 _BasicFaceFilter → Prefabs下还有其他已经做好的预制体:
同样的,要添加这些特效,我们需要先将AR Default Face可视化。
2. 将提供的预制体拖拽至Face_Reference_Mesh下作为AR Default Face的子物体,接着使用移动工具拖拽该预制体至合适位置:
最后,退出预制体编辑回到场景中,所做的更改会自动保存。
打包并测试效果,如果感觉位置不满意,还可以再继续调整修改。
也可以使用自己在Blender、3dsMax或Maya软件中建立的模型导入Unity中,这些软件通常会将材质和纹理嵌入模型。而导入Unity后,如果这些材质和纹理没有显示,那么需要做如下设置:
选择Extract Textures和Extract Materials并选择纹理和材质要保存地路径。
注:还可以使用ProBuilder这样的Unity工具在编辑器中创建一些复杂的图形。
Unity资源商店中有很多不同种类的资源,我们可以直接下载后导入Unity使用。但是最好找一些低多边形(low-poly)的模型,以便在移动设备上的良好性能。比如,这个帽子资源就比较推荐使用。
网格优化是也是保证游戏和应用程序有更好性能的重要方法之一。游戏或应用中每个模型的网格(如我们刚刚添加到AR应用中的模型)都是由多边形组成的。游戏资产中的多边形数量很大程度上影响了游戏性能。高多边形数量需要大量的实时计算和管理,导致帧率下降。
对于移动硬件,将每个网格的多边形数量保持在300到1500个之间会产生良好的效果;而对于桌面平台,理想的范围是1500到4000个多边形。注意,场景中的整体多边形数量也很关键,这意味着一个有很多人物的场景需要使用更低的多边形数量的模型。
Unity中动画相关的有两个重要的东西:
在Assets文件夹下找到_BasicFaceFilter → Animations文件夹,其中带三角形图标的是Animation Clips;而带有两个相连方框图标的是Animator Controller。
打包出来测试,我们会发现当程序检测到人脸时,模型动画会播放。
可以尝试修改动画的关键帧或添加自己的关键帧;
除了修改动画的常规属性如位置、旋转和大小,还可以尝试通过修改Mesh Renderer.Material.Base Color实现物体在动画中颜色的变换;
还可以尝试自己制作动画。
我们还可以为项目添加粒子特效。粒子是用来模拟一些常见的运动效果如水花溅射和火光炸裂效果等等。
在Assets文件夹下找到_BasicFaceFilter → Particle Effects文件夹,并双击其中一个粒子特效打开它预览。
由于粒子系统是由若干个模块组成的,用来控制粒子的行为和外观,因此需要选择其子物体才能预览到其效果(如要预览多个粒子特效,使用Ctrl键将它们同时选中预览。):
要添加粒子特效,同样的,需要把AR Default Face可视化。
在Assets中的 _BasicFaceFilter → Prefabs下找到AR Default Face预制体,并双击打开它。
在Hierarchy面板中右键Create Empty新建一个空物体,命名为“Particle Effects”把它作为粒子特效的父物体,这个点就是粒子系统的出生点。
粒子特效的最大特性就是其无与伦比的可定制性,每个粒子特效都可以是一个独有的创作。
需要注意Simulation Space是设置为World:
粒子可以以各种方式运动,这取决于它们是在怎样的模拟空间中被创造的。World的Simulation Space将使得粒子会随着脸部的移动而改变其位置!
还可以修改Emission模块中的Rate Over Time属性来改变粒子产生的数量,但是需要注意如果过多的粒子会导致运行性能的下降!
还可以试着调整以下的模块属性:
当调整完粒子特效的效果后,需要把Face_Reference_Mesh隐藏,接着退出预制体编辑以应用修改。
Unity资源商店中也有很多的粒子特效,比如Unity官方的Particle Pack和Legacy Particle Pack,但需要编辑其中的一些材质以保证其正常显示。
当然也可以自己制作粒子特效,比如能发射出激光的眼睛,向上浮动的爱心,围绕着脸转动的星星特效等等。
打包出来测试,我们会发现当程序检测到人脸时,粒子特效会播放。同时,当我们的位置移动时,粒子特效也会随之移动。
后期处理是全屏图像处理中的一个专业术语,它发生在相机捕捉到场景之后,但在场景被渲染到屏幕上之前。后期处理效果可以改变相机的焦点,使场景中的明亮区域发光,或使相机视图的边缘变暗……还可以提供许多其他不同的效果。总之,这是一种能提升应用视觉效果的处理方法。
我们可以通过不同的方式为Unity项目添加后期处理效果,这将取决于项目的类型,本项目采用的是URP渲染管线。可以配置一个名为volume的东西为URP项目添加后处理,如果一个场景中有多处需要不同的后处理效果,那么可以配置多个volume在不同区域显示不同的后处理效果。
在Hierarchy面板中右键选择Volume → Global Volume,这表示该后期处理效果将全局应用于整个场景。接着,在Volume组件的Profile右侧点击New按钮,创建一个volume配置文件:
首先添加Color Adjustments后期处理,它将对相机看到的所有东西应用一个颜色的色调,它也是最明显的后期处理效果之一。
点击ALL启用所有的选项,并选择Color Filter的颜色来对场景整体的颜色微调:
虽然后期处理可以使得应用程序更具视觉冲击力,但由于它们会占用大量的资源,因此会导致严重的性能问题。目前大多AR应用都是在移动设备上运行,因此在选择后期处理效果时,需要考虑到硬件的限制。
如果项目是URP渲染管线,那么以下的效果是推荐使用的: