目录
接着上篇文章的创建一个简单的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。
将上一步制作好的AR Default Face预制体拖拽至AR Face Manager组件的Face Prefab:

在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通道的灰度值来控制透明度。
选中Assets中刚刚新建的材质,在Inspector窗口中将其 Surface Type 属性修改为Transparent:

可以观察到场景中的面部也变成了水纹的特效:

如果想自己设计纹理,那么可以在这里下载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的子物体,接着使用移动工具拖拽该预制体至合适位置:

接着,隐藏Face_Reference_Mesh物体,因为它只是作为一个位置参考用。

最后,退出预制体编辑回到场景中,所做的更改会自动保存。
打包并测试效果,如果感觉位置不满意,还可以再继续调整修改。
也可以使用自己在Blender、3dsMax或Maya软件中建立的模型导入Unity中,这些软件通常会将材质和纹理嵌入模型。而导入Unity后,如果这些材质和纹理没有显示,那么需要做如下设置:
在Assets文件夹下先找到导入的FBX格式模型,在Inspector面板中,选择Materials标签。

选择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预制体,并双击打开它。
将之前添加的模型隐藏,并显示Face_Reference_Mesh,这样我们就能更好地定位粒子特效应该放在哪里合适。

在Hierarchy面板中右键Create Empty新建一个空物体,命名为“Particle Effects”把它作为粒子特效的父物体,这个点就是粒子系统的出生点。
将该空物体调整至合适位置,接着将Particle Effects文件夹下的合适粒子特效拖拽到该空物体下。

粒子特效的最大特性就是其无与伦比的可定制性,每个粒子特效都可以是一个独有的创作。
我们可以先从修改已有的粒子特效开始着手,比如可以选中粒子特效修改它的Start Color:

需要注意Simulation Space是设置为World:

粒子可以以各种方式运动,这取决于它们是在怎样的模拟空间中被创造的。World的Simulation Space将使得粒子会随着脸部的移动而改变其位置!
还可以修改Emission模块中的Rate Over Time属性来改变粒子产生的数量,但是需要注意如果过多的粒子会导致运行性能的下降!

还可以试着调整以下的模块属性:
Emission:影响粒子特效生成的速度和时间。

Shape:定义了发射粒子的体积或表面。

Color over Lifetime:规定了粒子的颜色和透明度在其生命周期中的变化。

当调整完粒子特效的效果后,需要把Face_Reference_Mesh隐藏,接着退出预制体编辑以应用修改。
Unity资源商店中也有很多的粒子特效,比如Unity官方的Particle Pack和Legacy Particle Pack,但需要编辑其中的一些材质以保证其正常显示。
当然也可以自己制作粒子特效,比如能发射出激光的眼睛,向上浮动的爱心,围绕着脸转动的星星特效等等。
打包出来测试,我们会发现当程序检测到人脸时,粒子特效会播放。同时,当我们的位置移动时,粒子特效也会随之移动。
后期处理是全屏图像处理中的一个专业术语,它发生在相机捕捉到场景之后,但在场景被渲染到屏幕上之前。后期处理效果可以改变相机的焦点,使场景中的明亮区域发光,或使相机视图的边缘变暗……还可以提供许多其他不同的效果。总之,这是一种能提升应用视觉效果的处理方法。
我们可以通过不同的方式为Unity项目添加后期处理效果,这将取决于项目的类型,本项目采用的是URP渲染管线。可以配置一个名为volume的东西为URP项目添加后处理,如果一个场景中有多处需要不同的后处理效果,那么可以配置多个volume在不同区域显示不同的后处理效果。
首先,在hierarchy面板中找到AR Session Origin下的AR Camera子物体:

在其Inspector面板中,找到相机组件的Rendering模块,确保Post Processing启用:

在Hierarchy面板中右键选择Volume → Global Volume,这表示该后期处理效果将全局应用于整个场景。接着,在Volume组件的Profile右侧点击New按钮,创建一个volume配置文件:

在Volume组件下选择Add Override为Volume添加一个单独的特效:

首先添加Color Adjustments后期处理,它将对相机看到的所有东西应用一个颜色的色调,它也是最明显的后期处理效果之一。
点击ALL启用所有的选项,并选择Color Filter的颜色来对场景整体的颜色微调:

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

Chromatic Aberration:色差

Color Grading:颜色分级
Lens Distortion:镜头失真

Vignette:晕影。晕影可以使用户聚焦于屏幕的中心,或在边缘增加一个柔和的淡化效果。这个术语来自于摄影,晕影指的是图像边缘的变暗或去饱和。
可以修改Vignette的以下属性:

Color Curves:颜色曲线。我们可以使用色相与饱和度( Hue vs Saturation )曲线来调整场景中颜色和饱和度的特定范围。可以做以下的尝试:

出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此