【Unity】创建一个自己的AR脸部特效安卓程序

目录

  • 1 创建一个换脸AR场景
  • 2 下载官方提供的BasicFaceFilterAssets资源
  • 3 设置AR面部追踪
  • 4 配置AR Face Manager
  • 5 配置AR Camera为前置摄像头
  • 6 打包并测试
  • 7 添加自己的材质
    • 7.1 更改脸部检测的显示材质
    • 7.2 添加自定义纹理
    • 7.3 设置透明
    • 7.4 应用修改
    • 7.5 打包测试
  • 8 图像优化
    • 8.1 图像大小
    • 8.2 图像类型
  • 9 添加自己的模型
    • 9.1 使用官方提供的模型
    • 9.2 使用自己的模型
    • 9.3 使用Unity资源商店的模型
  • 10 网格优化
  • 11 添加动画
    • 11.1 使用官方提供的动画控制器
    • 11.2 打包测试
    • 11.3 其他尝试
  • 12 添加粒子特效
    • 12.1 使用官方提供的粒子特效
    • 12.2 修改粒子特效
    • 12.3 使用资源商店的粒子特效
    • 12.4 打包测试
  • 13 添加后期处理效果(Post-processing)
    • 13.1 改变全局色调
    • 13.2 移动设备的限制

1 创建一个换脸AR场景

接着上篇文章的创建一个简单的AR安卓程序,这次来创建一个自己的AR换脸程序。同样使用之前的项目,在Assets的Scene文件夹下使用Ctrl+N新建一个Scene(或者File→New Scene),选择AR场景,点击Create创建:【Unity】创建一个自己的AR脸部特效安卓程序_第1张图片
这样,就可以直接在配置好AR环境的AR Scene中添加自己的模型了,使用Ctrl+S保存该场景并为其命名。

2 下载官方提供的BasicFaceFilterAssets资源

zip下载位置在此,点击即可下载。
下载完成解压后,即可将BasicFaceFilterAssets.unitypackage导入工程的Assets文件夹下。

导入方法
菜单栏选择Assets → Import Package → Custom package,接着选择刚才zip文件解压的文件夹位置,找到其中的unitypackage,双击后会跳出一个导入资源的窗口,点击右下角的Import导入。

3 设置AR面部追踪

由于要制作一个换脸程序,那么首先需要实现面部追踪。这部分工作官方已经做好了,我们只需要添加到场景中并在程序中可视化。这里使用到AR Default Face来追踪面部,因此,需要将AR Default Face做成预制体。当摄像机识别到面部时,该预制体被激活。为了可视化面部捕捉,需要为AR Default Face预制体添加一个材质。

  1. 在Hierarchy面板中右键选择XR → AR Default Face 为场景添加一个 AR Default Face 物体:
    在这里插入图片描述

  2. 由于该项目是URP管线,因此需要确保AR Default Face物体的材质有效。在Assets下找到_BasicFaceFilter → Materials,并将Materials下的Face Debug MAT材质拖拽至AR Default Face物体的Inspector中:
    【Unity】创建一个自己的AR脸部特效安卓程序_第2张图片

  3. 将处理好的AR Default Face物体做成预制体放到Assets → _BasicFaceFilter → Prefabs下:
    【Unity】创建一个自己的AR脸部特效安卓程序_第3张图片

4 配置AR Face Manager

这一步中,我们将使用AR Face Manager来告知AR Session Origin,当检测到面部时,脸上将会显示什么特效。

  1. 将Hierarchy中的Cube物体删除,它只是用于测试的。

  2. 选中AR Session Origin物体,在其Inspector窗口中搜索并添加AR Face Manager组件:
    【Unity】创建一个自己的AR脸部特效安卓程序_第4张图片
    AR Face Manager组件用于增删改代表面部的GameObject。

  3. 将上一步制作好的AR Default Face预制体拖拽至AR Face Manager组件的Face Prefab:
    【Unity】创建一个自己的AR脸部特效安卓程序_第5张图片

  4. 在Hierarchy中删掉AR Face Manager预制体,因为我们只想它在实际检测到人脸时再显示。

5 配置AR Camera为前置摄像头

之前的正方体旋转AR程序用到的是手机的后置摄像头,而脸部特效AR程序需要使用到的是手机的前置摄像头。

  1. 在Hierarchy中找到AR Session Origin物体,展开其折叠物体并找到AR Camera物体。
  2. 在AR Camera的Inspector面板中找到AR Camera Manager组件,将其中的Facing Direction属性设置为User:
    【Unity】创建一个自己的AR脸部特效安卓程序_第6张图片

6 打包并测试

菜单栏File → Build Settings,将AR脸部特效场景添加至Scenes In Build中,项目配置参考上篇文章的第3.2节。
手机打开该程序,可以发现脸上被覆盖了绿色的材质。

7 添加自己的材质

7.1 更改脸部检测的显示材质

一种方式是直接在之前的绿色材质上使用取色器替换其他的颜色:
【Unity】创建一个自己的AR脸部特效安卓程序_第7张图片

另一种方式是新建一个材质,也可以复制之前的绿色材质,在其之上再做修改。
在这里插入图片描述

可修改的参数还包括Metallic Map、Smoothness以及Emission:

【Unity】创建一个自己的AR脸部特效安卓程序_第8张图片

  • Metallic Map:金属性贴图。该值越高,材质就越具有金属性。金属性越强,越能反射更多的光线。
  • Smoothness:平滑程度。该值越高,材质就越光滑。越光滑,越能反射更多的光线。
  • Emission:自发光。启用这个属性时,物体会根据选取的颜色自发光。

7.2 添加自定义纹理

由于之前的调试中AR Default Face物体被制作成预制体,只有当程序运行起来并检测到人脸时才会显示。因此为了方便添加我们自定义的纹理,这里使用Face_Reference_Mesh模型将人脸可视化,它将作为面部参考网格,用于可视纹理、配饰以及特效等。

  1. 在Assets中找到_BasicFaceFilter → Prefabs下的Face_Reference_Mesh预制体,将其拖拽至场景中:
    【Unity】创建一个自己的AR脸部特效安卓程序_第9张图片
  2. 在Materials文件夹下右键Create → Material新建一个材质,把新建的材质命名为“FaceTexture”,选中该新建的材质,在Inspector面板中找到Base Map,它又叫Albedo(反射率),表示一个物体在受到任何灯光影响前的颜色。点击Base Map左侧的小圆圈图标进行导航,在弹出的面板搜索并找到“FaceTexture_Waves”,双击以适配。
    【Unity】创建一个自己的AR脸部特效安卓程序_第10张图片
  3. 将该材质拖拽至场景中的Face_Reference_Mesh上以应用新的材质:
    【Unity】创建一个自己的AR脸部特效安卓程序_第11张图片
    4.可以对材质进行色调的微调。当在Base Map右侧选择一个颜色时,它会以纯色的形式应用到材质中;而当一个纹理也被添加到Base Map中时,Base Map右侧的颜色会被作为纹理的一个色调融合到纹理中。
    【Unity】创建一个自己的AR脸部特效安卓程序_第12张图片

7.3 设置透明

材质的透明度是由其Alpha通道决定的。Alpha图是用于控制材质透明度的灰度图,越深的像素点透明度越高,反之越浅的像素点透明度越低。
由于Alpha图只使用灰度值,它们包含在一个通道中。Unity中使用Base Map图像的Alpha通道的灰度值来控制透明度。

  1. 选中Assets中刚刚新建的材质,在Inspector窗口中将其 Surface Type 属性修改为Transparent:
    【Unity】创建一个自己的AR脸部特效安卓程序_第13张图片

  2. 可以观察到场景中的面部也变成了水纹的特效:
    【Unity】创建一个自己的AR脸部特效安卓程序_第14张图片

如果想自己设计纹理,那么可以在这里下载psd贴图文件使用PhotoShop或者Gimp(Photoshop的开源替代品,可用于图像的创建、修改以及导出)来对其进行编辑。

7.4 应用修改

需将新建的材质应用到AR Default Face 预制体,才能在运行时检测到人脸显示上述效果:

  1. 在 Assets → _BasicFaceFilter → Prefabs下找到AR Default Face,双击它以打开预制体,在其Inspector面板中找到Mesh Renderer组件,并在Element 0的右侧点击小圆圈图标导航,选择制作好的FaceTexture材质,编辑好退出Prefab回到Scene窗口。
    【Unity】创建一个自己的AR脸部特效安卓程序_第15张图片

2.在Hierarchy窗口中隐藏Face_Reference_Mesh物体。
【Unity】创建一个自己的AR脸部特效安卓程序_第16张图片

7.5 打包测试

注意在Player Settings面板中修改一下程序迭代的版本号,打包项目上机测试,可以观察到当检测到人脸时,水纹面具覆盖在你的脸上。

8 图像优化

图像优化对AR体验至关重要,因为移动设备的处理能力有限。当涉及到为AR创建纹理时,需要考虑到图像的大小、图像的类型以及纹理是否需要有透明度。

8.1 图像大小

图像的纹理尺寸大小通常是用2的幂次数来表示的,如512 x 512, 1024 x 1024, 2048 x 2048 (2K) and 4096 x 4096 (4K)。较老旧的显卡需要固定是2的幂次数尺寸才能运行良好,大多新的显卡已然没有这个限制,但使用2的幂次数大小的尺寸仍被认为是最佳的做法。

8.2 图像类型

图像的类型对于优化也有较大的影响。需要考虑到如下的因素:

  • 目标平台上的可用存储空间
  • 读取速度(即目标平台将图像从磁盘获取到系统内存的速度)
  • 从系统内存到GPU的读取速度
  • 目标平台的视频RAM存储预算

对于不同类型的图像,它们各有优劣,我们应当考虑最适合我们的策略:

  • PNG:PNG格式以合理的小文件尺寸保留了质量,包括一个alpha通道。然而,PNG文件是压缩的,所以它们在阅读过程中需要解压缩。小文件的好处往往大于读取文件所花费的额外时间,因此在大多数情况下,PNG是一种理想的文件类型。
  • TGA:TGA格式是有较好的质量,因为它是未压缩的,包括一个alpha通道。然而,TGA是一个大文件格式,所以它的加载速度很慢。TGA文件是支持预加载纹理的较好选择,比如AR应用中的背景图像。
  • JPG:JPG格式的文件大小较小,但在这个过程中每次压缩都会有质量损失。JPG不包含alpha贴图,所以它们不能用于任何需要透明的东西。

9 添加自己的模型

9.1 使用官方提供的模型

我们可以观察到在Assets 中的 _BasicFaceFilter → Prefabs下还有其他已经做好的预制体:

在这里插入图片描述
同样的,要添加这些特效,我们需要先将AR Default Face可视化。

  1. 在Prefabs文件夹中找到AR Default Face预制体,双击打开它。接着将Face_Reference_Mesh拖拽至AR Default Face下作为它的子物体,我们就可以双击Face_Reference_Mesh看到它了。

【Unity】创建一个自己的AR脸部特效安卓程序_第17张图片
2. 将提供的预制体拖拽至Face_Reference_Mesh下作为AR Default Face的子物体,接着使用移动工具拖拽该预制体至合适位置:
【Unity】创建一个自己的AR脸部特效安卓程序_第18张图片

  1. 接着,隐藏Face_Reference_Mesh物体,因为它只是作为一个位置参考用。
    【Unity】创建一个自己的AR脸部特效安卓程序_第19张图片

  2. 最后,退出预制体编辑回到场景中,所做的更改会自动保存。

  3. 打包并测试效果,如果感觉位置不满意,还可以再继续调整修改。

9.2 使用自己的模型

也可以使用自己在Blender、3dsMax或Maya软件中建立的模型导入Unity中,这些软件通常会将材质和纹理嵌入模型。而导入Unity后,如果这些材质和纹理没有显示,那么需要做如下设置:

  1. 在Assets文件夹下先找到导入的FBX格式模型,在Inspector面板中,选择Materials标签。
    【Unity】创建一个自己的AR脸部特效安卓程序_第20张图片

  2. 选择Extract Textures和Extract Materials并选择纹理和材质要保存地路径。

注:还可以使用ProBuilder这样的Unity工具在编辑器中创建一些复杂的图形。

9.3 使用Unity资源商店的模型

Unity资源商店中有很多不同种类的资源,我们可以直接下载后导入Unity使用。但是最好找一些低多边形(low-poly)的模型,以便在移动设备上的良好性能。比如,这个帽子资源就比较推荐使用。

10 网格优化

网格优化是也是保证游戏和应用程序有更好性能的重要方法之一。游戏或应用中每个模型的网格(如我们刚刚添加到AR应用中的模型)都是由多边形组成的。游戏资产中的多边形数量很大程度上影响了游戏性能。高多边形数量需要大量的实时计算和管理,导致帧率下降。

对于移动硬件,将每个网格的多边形数量保持在300到1500个之间会产生良好的效果;而对于桌面平台,理想的范围是1500到4000个多边形。注意,场景中的整体多边形数量也很关键,这意味着一个有很多人物的场景需要使用更低的多边形数量的模型。

11 添加动画

11.1 使用官方提供的动画控制器

Unity中动画相关的有两个重要的东西:

  • Animation Clips:动画片段可用于简单动画的制作,如一个角色的行走、运行或站立动画。
  • Animator Controller:动画控制器用于控制动画片段的播放。可以使用动画控制器来为一个角色或一个游戏物体切换一组动画片段。

在Assets文件夹下找到_BasicFaceFilter → Animations文件夹,其中带三角形图标的是Animation Clips;而带有两个相连方框图标的是Animator Controller。
【Unity】创建一个自己的AR脸部特效安卓程序_第21张图片

  1. 在Assets下的_BasicFaceFilter → Prefabs中找到AR Default Face预制体,双击打开它,并找到需要做动画的模型,点击它右边的箭头以打开模型的预制体。
    【Unity】创建一个自己的AR脸部特效安卓程序_第22张图片
  2. 接着可以在其Inspector面板看到有一个Animator组件,在Controller属性右侧点击小圆圈图标导航动画控制器。
    【Unity】创建一个自己的AR脸部特效安卓程序_第23张图片
  3. 最后,退出预制体的编辑以保存更改。

11.2 打包测试

打包出来测试,我们会发现当程序检测到人脸时,模型动画会播放。

11.3 其他尝试

  • 可以尝试修改动画的关键帧或添加自己的关键帧;

    • 选择模型后,使用快捷键Ctrl+6可以打开Animation面板,对动画的关键帧进行更改:
      【Unity】创建一个自己的AR脸部特效安卓程序_第24张图片
  • 除了修改动画的常规属性如位置、旋转和大小,还可以尝试通过修改Mesh Renderer.Material.Base Color实现物体在动画中颜色的变换;
    【Unity】创建一个自己的AR脸部特效安卓程序_第25张图片

  • 还可以尝试自己制作动画。

12 添加粒子特效

12.1 使用官方提供的粒子特效

我们还可以为项目添加粒子特效。粒子是用来模拟一些常见的运动效果如水花溅射和火光炸裂效果等等。
在Assets文件夹下找到_BasicFaceFilter → Particle Effects文件夹,并双击其中一个粒子特效打开它预览。
由于粒子系统是由若干个模块组成的,用来控制粒子的行为和外观,因此需要选择其子物体才能预览到其效果(如要预览多个粒子特效,使用Ctrl键将它们同时选中预览。):
【Unity】创建一个自己的AR脸部特效安卓程序_第26张图片
要添加粒子特效,同样的,需要把AR Default Face可视化。

  1. 在Assets中的 _BasicFaceFilter → Prefabs下找到AR Default Face预制体,并双击打开它。

  2. 将之前添加的模型隐藏,并显示Face_Reference_Mesh,这样我们就能更好地定位粒子特效应该放在哪里合适。
    【Unity】创建一个自己的AR脸部特效安卓程序_第27张图片

  3. 在Hierarchy面板中右键Create Empty新建一个空物体,命名为“Particle Effects”把它作为粒子特效的父物体,这个点就是粒子系统的出生点。

  4. 将该空物体调整至合适位置,接着将Particle Effects文件夹下的合适粒子特效拖拽到该空物体下。
    【Unity】创建一个自己的AR脸部特效安卓程序_第28张图片

12.2 修改粒子特效

粒子特效的最大特性就是其无与伦比的可定制性,每个粒子特效都可以是一个独有的创作。

  1. 我们可以先从修改已有的粒子特效开始着手,比如可以选中粒子特效修改它的Start Color:
    【Unity】创建一个自己的AR脸部特效安卓程序_第29张图片

  2. 需要注意Simulation Space是设置为World:
    【Unity】创建一个自己的AR脸部特效安卓程序_第30张图片
    粒子可以以各种方式运动,这取决于它们是在怎样的模拟空间中被创造的。World的Simulation Space将使得粒子会随着脸部的移动而改变其位置!

  3. 还可以修改Emission模块中的Rate Over Time属性来改变粒子产生的数量,但是需要注意如果过多的粒子会导致运行性能的下降!
    【Unity】创建一个自己的AR脸部特效安卓程序_第31张图片

  4. 还可以试着调整以下的模块属性:

    • Emission:影响粒子特效生成的速度和时间。
      【Unity】创建一个自己的AR脸部特效安卓程序_第32张图片

    • Shape:定义了发射粒子的体积或表面。
      【Unity】创建一个自己的AR脸部特效安卓程序_第33张图片

    • Color over Lifetime:规定了粒子的颜色和透明度在其生命周期中的变化。
      【Unity】创建一个自己的AR脸部特效安卓程序_第34张图片

  5. 当调整完粒子特效的效果后,需要把Face_Reference_Mesh隐藏,接着退出预制体编辑以应用修改。

12.3 使用资源商店的粒子特效

Unity资源商店中也有很多的粒子特效,比如Unity官方的Particle Pack和Legacy Particle Pack,但需要编辑其中的一些材质以保证其正常显示。

当然也可以自己制作粒子特效,比如能发射出激光的眼睛,向上浮动的爱心,围绕着脸转动的星星特效等等。

12.4 打包测试

打包出来测试,我们会发现当程序检测到人脸时,粒子特效会播放。同时,当我们的位置移动时,粒子特效也会随之移动。

13 添加后期处理效果(Post-processing)

13.1 改变全局色调

后期处理是全屏图像处理中的一个专业术语,它发生在相机捕捉到场景之后,但在场景被渲染到屏幕上之前。后期处理效果可以改变相机的焦点,使场景中的明亮区域发光,或使相机视图的边缘变暗……还可以提供许多其他不同的效果。总之,这是一种能提升应用视觉效果的处理方法。

我们可以通过不同的方式为Unity项目添加后期处理效果,这将取决于项目的类型,本项目采用的是URP渲染管线。可以配置一个名为volume的东西为URP项目添加后处理,如果一个场景中有多处需要不同的后处理效果,那么可以配置多个volume在不同区域显示不同的后处理效果。

  1. 首先,在hierarchy面板中找到AR Session Origin下的AR Camera子物体:
    【Unity】创建一个自己的AR脸部特效安卓程序_第35张图片

  2. 在其Inspector面板中,找到相机组件的Rendering模块,确保Post Processing启用:
    【Unity】创建一个自己的AR脸部特效安卓程序_第36张图片

  3. 在Hierarchy面板中右键选择Volume → Global Volume,这表示该后期处理效果将全局应用于整个场景。接着,在Volume组件的Profile右侧点击New按钮,创建一个volume配置文件:
    【Unity】创建一个自己的AR脸部特效安卓程序_第37张图片

  4. 在Volume组件下选择Add Override为Volume添加一个单独的特效:
    【Unity】创建一个自己的AR脸部特效安卓程序_第38张图片

  5. 首先添加Color Adjustments后期处理,它将对相机看到的所有东西应用一个颜色的色调,它也是最明显的后期处理效果之一。
    点击ALL启用所有的选项,并选择Color Filter的颜色来对场景整体的颜色微调:
    【Unity】创建一个自己的AR脸部特效安卓程序_第39张图片

13.2 移动设备的限制

虽然后期处理可以使得应用程序更具视觉冲击力,但由于它们会占用大量的资源,因此会导致严重的性能问题。目前大多AR应用都是在移动设备上运行,因此在选择后期处理效果时,需要考虑到硬件的限制。
如果项目是URP渲染管线,那么以下的效果是推荐使用的:

  • Bloom (禁用High Quality Filtering):发光
    【Unity】创建一个自己的AR脸部特效安卓程序_第40张图片

  • Chromatic Aberration:色差
    在这里插入图片描述

  • Color Grading:颜色分级

  • Lens Distortion:镜头失真
    【Unity】创建一个自己的AR脸部特效安卓程序_第41张图片

  • Vignette:晕影。晕影可以使用户聚焦于屏幕的中心,或在边缘增加一个柔和的淡化效果。这个术语来自于摄影,晕影指的是图像边缘的变暗或去饱和。
    可以修改Vignette的以下属性:
    【Unity】创建一个自己的AR脸部特效安卓程序_第42张图片

    • Color:使用颜色选择器来设置晕染的颜色。
    • Intensity:设置晕影效果的强度。
    • Smoothness:设置光晕边框的平滑度。
  • Color Curves:颜色曲线。我们可以使用色相与饱和度( Hue vs Saturation )曲线来调整场景中颜色和饱和度的特定范围。可以做以下的尝试:

    • 制作单色场景,使用去除饱和度实现;
    • 只剩下一个颜色,去除其他所有的颜色。
      【Unity】创建一个自己的AR脸部特效安卓程序_第43张图片

你可能感兴趣的:(unity,ar,android)