IT圈老男孩1 发表于 2022-1-27 22:08

Unity开源项目:AR Foundation Demos

此仓库(Demos Repo)旨在为Samples Repo之外的 AR Foundation 提供更高级的演示。Plastic开源仓库地址:arfoundation-demos


此仓库(Demos Repo)旨在为Samples Repo之外的 AR Foundation 提供更高级的演示。关于 AR Foundation 相关的问题,可以到 AR Foundation Sample issues上发布。
AR Foundation-Demos


AR Foundation的演示项目。使用AR Foundation 4.1.7并围绕某些特性展示更高级功能的演示项目。 这组演示依赖于以下 Unity 包:


[*]ARSubsystems(文档)
[*]ARCore XR 插件(文档)
[*]ARKit XR 插件(文档)
[*]ARFoundation(文档)
ARSubsystems 定义了一个接口,平台特定的实现在 ARCore 和 ARKit 包中。ARFoundation 将 ARSubsystems 提供的 AR 数据转化为 UnityGameObject和Unity MonoBehavour。
master分支兼容 Unity 2020.3.13f1 +
在Unity 2020.2 进行构建


在 Unity 2020.2 中为 Android 平台进行构建时,您需要在Project Setting/Player /Publishing Settings下修改以下设置:


[*]取消选中自定义Main Gradle 模板和
[*]取消选中自定义Launcher Gradle 模板
这些在升级到 Unity 2020.3 LTS 期间已被删除。

图像跟踪




这个示例应用程序展示了如何使用图像跟踪来对多个独特的图像进行跟踪,并为每个图像生成独特的预制件。
脚本ImageTrackingObjectManager.cs。处理存储预制件并根据找到的图像更新它们。它链接到ARTrackedImageManager.trackedImagesChanged 回调,为每个跟踪的图像生成预制件,更新它们的位置,根据它的跟踪状态在预制件上显示视觉效果,如果删除则销毁它。
该项目包含两个独特的图像 one.png 和 two.png 可以打印出来或显示在数字设备上。图像为 2048x2048 像素,真实世界尺寸为 0.2159 x 0.2159 米。
每个数字的预制件衍生自OnePrefab.prefab. 他们使用一个小四边形MobileARShadow.shader来准确显示 3D 数字的阴影。
脚本DistanceManager.cs会检查跟踪图像之间的距离,并在它们达到某个接近度时在它们之间显示一个额外的 3D 模型。
脚本NumberManager.cs处理在 3D 数字对象上设置一个contraint(在本例中用于展示模型),并提供一个函数来启用和禁用 3D 模型的渲染。



ImageTracking 场景中缺少预制件。


如果您在没有Onboarding UX 的情况下导入图像跟踪包或从资产商店下载它,您的场景中将会缺少预制件。此预制件是来自 Onboarding UX的已配置ScreenSpaceUI 预制件。它配置有用于查找图像的 UI,以查找图像为目标。

UX




一个 UI / UX 框架,用于为用户提供各种不同类型的移动 AR 应用程序的指导。
该框架采用了考虑教学目标情况下显示教学 UI 的想法。一个常见的用途是UI 指示用户移动他们的设备,以帮助用户找到平面。一旦达到目标,UI 就会淡出。还有一个辅助指令 UI 和一个 API,允许开发人员添加任意数量的附加 UI 和目标,这些 UI 和目标将进入队列并依次处理。
一个常见的两步 UI / 目标是指示用户找到一个平面。找到平面后,您可以指示用户点击以放置对象。放置对象后,UI 随即淡出。



教学 UI由以下动画/视频组成


[*]跨平台查找平面
[*]查找一张脸
[*]查找一个身体
[*]查找一个图像
[*]查找一个对象
[*]ARKit Coaching Overlay
[*]点击放置
[*]None
所有的教学 UI(除了 ARKit Coaching Overlay)都是一个包含的 .webm 视频,使用 VP8 编解码器编码以支持透明度。
以下为目标 淡出 UI


[*]查找到了一个平面
[*]查找到多个平面
[*]查找一张脸
[*]查找一个身体
[*]查找一个图像
[*]查找一个对象
[*]放置一个对象
[*]None
目标是检查相关ARTrackableManager的可追踪数量。需要注意的一点是,这只是寻找要添加的可跟踪对象,它不会检查所述可跟踪对象的跟踪状态。
脚本UIManager.cs用于配置教学目标、次要教学目标并保存对不同可跟踪管理器的引用。
UIManager 管理一个队列,UXHandle允许在运行时动态添加任何具有任何目标的教学 UI。为此,您可以存储对 UIManager 的引用并调用AddToQueue()传入 UXHandle 对象。出于测试目的,项目组使用以下设置来可视化每个 UI 视频。
m_UIManager = GetComponent<UIManager>();      
m_UIManager.AddToQueue(new UXHandle(UIManager.InstructionUI.CrossPlatformFindAPlane, UIManager.InstructionGoals.PlacedAnObject));
m_UIManager.AddToQueue(new UXHandle(UIManager.InstructionUI.FindABody, UIManager.InstructionGoals.PlacedAnObject));
m_UIManager.AddToQueue(new UXHandle(UIManager.InstructionUI.FindAFace, UIManager.InstructionGoals.PlacedAnObject));
m_UIManager.AddToQueue(new UXHandle(UIManager.InstructionUI.FindAnImage, UIManager.InstructionGoals.PlacedAnObject));
m_UIManager.AddToQueue(new UXHandle(UIManager.InstructionUI.FindAnObject, UIManager.InstructionGoals.PlacedAnObject));
m_UIManager.AddToQueue(new UXHandle(UIManager.InstructionUI.ARKitCoachingOverlay, UIManager.InstructionGoals.PlacedAnObject));
其中一个m_CoachingOverlayFallback用于在受支持的设备上启用 ARKit Coaching Overlay,但在不支持时回退到跨平台查找平面。
脚本ARUXAnimationManager.cs包含对所有视频的引用,控制所有用于淡入和淡出 UI 的逻辑,管理视频交换以及与每个视频/UI 交换相关文本。
脚本DisableTrackedVisuals包含对 ARPlaneManger 和 ARPointCloudManager 的引用,以允许禁用管理器和管理器本身生成的对象,从而防止进一步的平面跟踪或特征点(点云)跟踪。

追踪的依据




当会话(设备)未跟踪或丢失跟踪时,有多种不同的依据。向用户展示这些依据可能会有所帮助,以便他们更好地了解体验或可能阻碍体验的因素。
ARKit和ARCore的依据略有不同,但在 AR Foundation 中,这些都是通过相同的共享 API呈现。
ARUXReasonsManager.cs处理状态的可视化并订阅ARSession上的状态更改。在SetReaons()方法中设置了依据并更改了显示文本和图标。在这里,我将 Initializing 和 Relocalizing 都视为相同,并用于英文显示Initializing augmented reality.
本地化


如果您想使用本地化,请务必阅读本节末尾所需的可寻址构建文档。



教学 UI 和依据通过Unity 本地化包提供本地化支持。它在 AR UX 动画管理器中使用m_LocalizeText布尔值启用了教学 UI,并在 AR UX 依据管理器中使用m_LocalizeText布尔值启用了依据。
本地化目前支持以下语言:


[*]英语
[*]法语
[*]德语
[*]意大利语
[*]西班牙语
[*]葡萄牙语
[*]俄语
[*]简体中文
[*]韩语
[*]日语
[*]印地语
[*]荷兰语
泰米尔语和泰卢固语翻译可用,但由于字体渲染复杂性,当前未启用
通过导入到项目中并通过StringImporter.cs解析到正确的本地化表中的CSV支持本地化。

如果您想提供帮助、对更好的翻译有建议、或想添加其他语言,请通过这个公开的工作表进行联系


在场景中,本地化由脚本LocalizationManager.cs驱动,该脚本对每种支持的语言都有一个SupportedLanguages 枚举。当前的实现只支持在编译时选择和设置语言,而不是在运行时。这是因为从枚举中选择的语言是在LocalizationManager.cs的 Start() 方法中设置的。
设置语言后,根据每个值的特定键从表中检索本地化字段,然后在 AR UX 动画管理器和 AR UX 依据管理器中引用。
许多语言需要独特的字体才能正确呈现这些语言的字符,字体在运行时与SwapFonts()中的语言特定设置进行替换。
打包资产包以构建本地化支持


Localization 包使用Addressables来组织和打包翻译的字符串。为您的应用程序正确构建这些还需要一些额外的步骤。如果您要将文本本地化以获取说明或依据则您需要执行这些步骤。
1,打开 Addressables Groups 窗口(Window / Asset Management / Addressables / Groups)



2,在 Addressables Groups 窗口中单击 Build Tab / New Build / Default Build Script



3,您需要为您构建的每个平台执行此操作。(一次用于 Android,一次用于 iOS)。

网格放置




使用带有可用表面分类的ARKit 网格划分功能在表面上放置独特对象 的示例场景。此演示为对本Demo以外有用的一些用例添加的一些附加功能,例如放置标线和DOTween 渐变库。
网格分类


对表面进行分类由 MeshClassificationManager.cs 管理,MeshClassificationManager.cs维护着一个TrackableID 的字典和一个 ARMeshClassifications 的原生数组。通过订阅 AR Mesh Manager 上的 meshesChanged 事件,我们根据生成的网格的可跟踪 ID 维护添加、更新和删除网格的字典。
当前找到的网格上的可跟踪 ID 存在问题,因此我们使用字符串名称是为了正确提取和存储网格的正确可跟踪 ID一旦我们有了一个最新的字典,我们就可以根据一个可跟踪的 ID 作为键和一个三角形索引作为我们本机数组中的索引来查询它。这将返回一个 ARMeshClassification 枚举。
为了更新演示顶部的标签,我们使用物理射线投射对 ARMeshManager 生成的 megamesh 进行射线投射,以获得正确的三角形索引并解析当前分类以获得更易读的字符串标签。
要为物理射线投射生成网格碰撞器,我们的 megamesh 必须在其上包含网格碰撞器组件网格放置


Mesh Placement Manager脚本处理显示每个独特表面的UI 并在放置标线位置生成对象。在 Update 方法中,正在检查特定分类,在本例中为 Table、Floor 和 Wall 以启用或禁用特定的 UI 按钮。UI 按钮在场景中配置为传递索引并在每个表面的对象列表中实例化分配的预制件。
还有一些额外的逻辑用于放置地板和桌子对象以将它们转向用户(相机变换)。
放置标线


一种根据用户设备的中心屏幕位置在表面上放置内容的方法。此标线显示可以捕捉到网格(生成的 ARKit 网格)或平面的视觉效果。它使用 AR 光线投射来查找表面并捕捉到 AR 光线投射命中姿势位置和旋转。
还有一些额外的逻辑可以根据与用户的距离(AR 相机变换)来放大标线的局部比例。
为了确定是否捕捉到网格和平面,我们使用 Raycast Mask。
网格: m_RaycastMask = TrackableType.PlaneEstimated; 平面: m_RaycastMask = TrackableType.PlaneWithinPolgon;
网状钥匙


为了可视化和理解不同的分类表面,我们使用了AR Foundaiton Samples 中提供的MeshFracking脚本的修改版本。我们添加了一个额外的辅助方法来修改生成的网格ToggleVisability()的 alpha 颜色。这一切都由场景中的切换 UI 按钮驱动,并更改生成的预制件上每种材质的共享材质颜色。默认情况下,它们被配置为完全透明。

DOTween 可在Unity 资产商店获得


它在此演示用于当放置对象出现时按比例放大它们。
它由 Daniele Giardini - Demigiant 开发,版权所有 (c) 2014。DOTween 的完整许可证可在此处查看

Shaders


为 AR 和 AR 用例构建的着色器集合

ARKit 雾




此效果使用最新的深度 API,并且仅适用于支持 LiDAR 的 iOS 设备,例如 iPad Pro。目前这仅在内置渲染管道中受支持。
雾场景使用 ARKit 背景着色器,将 Unity 场景雾合并到用于将 ARKit 设备摄像头馈送到屏幕的着色器中。它在很大程度上基于 ARKit 包附带的 ARKitBackground 着色器。

为了正确使用此着色器,必须选中 ARCameraBackground 组件上的自定义材质复选框,并指定具有此着色器的材质。
雾场景包括 AR 平面查找和放置脚本,用于在使用标准着色器的 AR 中放置虚拟对象。场景在Lighting Settings 窗口中启用了雾。它设置为 35 的结束距离,并且在场景中配置了一个在 1-35 之间更改场景雾的 UI 滑块。操作此滑块将改变场景中雾的密度外观。



通用渲染管线Shader Graph着色器


免责声明


这些着色器配置有Universal Render Pipeline和Shader Graph。如果更新任何一个包,它们可能会发生变化或可能中断。这些着色器的一些实现基于当前的 API 和包结构,不能保证在未来的包中保持一致。

设置


要启用这些着色器,您必须在项目图形设置中分配通用渲染管线资源。此 Pipeline 资源已预先配置为与阴影着色器一起使用,并且 ARFoundationForwardRendererData 资源已配置为通过添加 AR 背景渲染功能正确地使用 AR Foundation 进行渲染。

线框着色器




此着色器可以在 Unity 中可视化任何网格的边缘。在这里,我们使用它来可视化 ARKit 从 AR Mesh Manager 生成的运行时网格。此着色器通过将重心数据(顶点颜色)与自定义着色器图相结合来确定边缘并将像素绘制为指定颜色。
MeshVisualization 场景配置为通过订阅 AR Mesh Manager 组件中的 MeshChanged 事件在运行时应用重心数据。AR Mesh Manager 使用 Mesh Visualization 预制件,该预制件具有 Mesh Filter 和 Mesh Renderer,并使用 WireFrame 着色器图分配了材质。添加或更新网格时,重心数据也会在网格上更新,从而启用此效果。



此示例通过切换 AR 平面管理器组件来启用和禁用平面跟踪。启用平面跟踪后,您可以看到网格沿平面的优化。阴影


阴影对于 AR 中的物体接地很重要。它可以帮助用户更好地了解增强内容在现实世界中的深度和位置。为了在通用渲染管道中启用阴影,已编写自定义 .hlsl 文件并将其用作自定义节点在着色器图中。
这两种着色器都是为应用在单个平面上而构建的,例如平面或四边形。对于层次结构设置,您可以看到使用这些着色器的预制件有一个空的根游戏对象,对象底部的平面和位于其上方的内容都作为根对象的子对象。

模糊的阴影




模糊阴影有两个自定义节点输入。一种用于使用此着色器使靠近平面的对象创建的接触阴影。另一个用于实现随机模糊以创建更柔和的阴影,使其边缘模糊。建议将这些阴影用于动态内容。
强烈建议No Cascades在 Universal Render Pipeline Asset 的 Shadow 设置中加入 Shadow Settings 以大幅提升性能。 要进一步提高性能,您可以将NUM_STEPS从 10 降低到 5,将TOTAL_STEPS从 10 降低到 5。会有明显的视觉差异,但应该提供更高的性能,尤其是在低端平台上。

硬阴影




这使用自定义节点来消耗场景中的照明数据,并将其应用到透明表面。此着色器的阴影由项目中的图形和质量设置驱动。这些是 Unity 开箱即用的阴影级别。建议将这些阴影用于静态内容。

Camera Grain摄像机颗粒 - 仅在 Unity 2020.3+ 和 ARKit 中兼容






相机颗粒是 ARKit 的一项独特功能,可生成可平铺的金属纹理以匹配当前视频流的视觉特征。在 Unity 中,这通过ARCameraFrameEventArgs显示为 3D 纹理纹理。对于着色器示例,然后将此颗粒纹理应用于自定义着色器图,该图也会在对象上产生视觉噪声。通常,这种效果非常微妙,并且在较暗的区域更明显,在这些区域中,相机进纸上的颗粒也更明显。

Unity 2020.2+ 版本的兼容性取决于 3D 纹理的处理和管理方式
此示例还使用脚本ProbePlacement手动放置环境探测器以进一步增强效果。
页: [1]
查看完整版本: Unity开源项目:AR Foundation Demos