ARCore 深度实验室 - Unity版深度API示例
版权所有 2020 Google LLC
深度实验室是一套ARCore深度API示例,提供使用深度进行AR交互和渲染的高级几何感知功能的资产。其中一些功能在这个深度API概述视频中有所展示。
ARCore深度API在部分ARCore认证的Android设备上启用。不支持iOS设备(iPhone, iPad)。在此处查看支持深度API的设备列表(标有支持深度API): https://developers.google.com/ar/devices。 更多信息请参阅ARCore开发者文档。
今天就在Google Play商店下载预构建的ARCore深度实验室应用。
分支
ARCore深度实验室有两个分支:master
和arcore_unity_sdk
。
master
分支包含v1.1.0中的部分深度实验室功能,基于推荐的AR Foundation 4.2.0(预览版7)或更新版本构建。master
分支支持的功能包括定向3D准星、深度图可视化、带深度网格的碰撞体、虚拟角色运动、原始点云可视化、录制和回放。
arcore_unity_sdk
分支包含深度实验室的全部功能,基于ARCore SDK for Unity v1.24.0或更新版本构建。我们建议使用master
分支使用AR Foundation SDK构建新项目,并在必要时参考此分支。
入门
这些示例针对Unity 2020.3.6f1,并要求AR Foundation 4.2.0-pre.7或更新版本,ARCore Extensions 1.24或更新版本。ARCore Extensions源代码通过Unity包管理器自动包含。
此项目仅支持Android构建平台。请将项目构建到Android设备上,而不是使用Unity编辑器中的播放按钮。
示例功能
示例场景演示了三种不同的深度访问方式。master
分支中支持的功能标有:star:,其余功能可在arcore_unity_sdk
分支中找到。
- 局部深度:在特定纹理坐标采样单个深度值(CPU)。
- 定向3D准星 :star:
- 角色在不平坦地形上的运动 :star:
- AR对象放置的碰撞检查
- 激光束反射
- 雨雪粒子碰撞
- 表面深度:创建深度数据的连接网格表示(CPU/GPU)。
- 点云融合 :star:
- AR阴影接收器
- 绘画喷溅
- 物理模拟
- 表面重新贴图
- 密集深度:处理每个屏幕像素的深度数据(GPU)。
- 伪彩色深度图 :star:
- AR雾效
- 遮挡
- 景深模糊
- 环境重光照
- 3D照片
构建示例
可以通过启用特定场景(例如,OrientedReticle
来尝试定向3D准星)和场景中的ARFDepthComponents
对象来构建和运行单个场景。在使用DemoCarousel
场景构建所有演示时,记得禁用单个场景中的ARFDepthComponents
对象。
我们还提供了一个演示用户界面,允许用户无缝切换示例。请确保将构建平台设置为Android,并验证主DemoCarousel
场景是否为构建设置中构建中的场景列表中的第一个启用场景。启用作为演示用户界面一部分的所有场景。
Assets/ARRealismDemos/DemoCarousel/Scenes/DemoCarousel.unity Assets/ARRealismDemos/OrientedReticle/Scenes/OrientedReticle.unity Assets/ARRealismDemos/DepthEffects/Scenes/DepthEffects.unity Assets/ARRealismDemos/Collider/Scenes/Collider.unity Assets/ARRealismDemos/AvatarLocomotion/Scenes/AvatarLocomotion.unity Assets/ARRealismDemos/PointCloud/Scenes/RawPointClouds.unity
以下场景可以在arcore_unity_sdk
分支中找到,但尚未在AR Foundation SDK中提供。
Assets/ARRealismDemos/MaterialWrap/Scenes/MaterialWrap.unity Assets/ARRealismDemos/Splat/Scenes/OrientedSplat.unity Assets/ARRealismDemos/LaserBeam/Scenes/LaserBeam.unity Assets/ARRealismDemos/Relighting/Scenes/PointsRelighting.unity Assets/ARRealismDemos/DepthEffects/Scenes/FogEffect.unity Assets/ARRealismDemos/SnowParticles/Scenes/ArCoreSnowParticles.unity Assets/ARRealismDemos/RainParticles/Scenes/RainParticlesScene.unity Assets/ARRealismDemos/DepthEffects/Scenes/DepthOfFieldEffect.unity Assets/ARRealismDemos/Water/Scenes/Water.unity Assets/ARRealismDemos/CollisionDetection/Scenes/CollisionAwareObjectPlacement.unity Assets/ARRealismDemos/ScreenSpaceDepthMesh/Scenes/ScreenSpaceDepthMesh.unity Assets/ARRealismDemos/ScreenSpaceDepthMesh/Scenes/StereoPhoto.unity
示例项目结构
主要的示例资产放置在Assets/ARRealismDemos
文件夹内。每个子文件夹包含示例功能或辅助组件。
AvatarLocomotion
此场景中的AR角色会沿着用户设置的路径点移动,同时保持贴近不平坦地形的表面。该场景使用CPU上的光线投射和深度查找来计算地形表面上的3D点。
Collider
这个物理模拟游乐场使用屏幕空间深度网格,实现Unity刚体对象与物理环境之间的碰撞。
按下屏幕上的按钮后,会根据最新的深度图程序化生成一个Mesh
对象。这用于更新MeshCollider
对象的sharedMesh
参数。然后,随机选择一个原始刚体对象投入环境中。
CollisionDetection
这个AR对象放置场景使用CPU上的深度查找来测试虚拟对象的顶点与物理环境之间的碰撞。
Common
此文件夹包含在功能样本之间共享的脚本和预制体。更多详情,请参阅下方的辅助类
部分。
DemoCarousel
此文件夹包含主场景,提供一个轮播用户界面。该场景允许用户无缝切换不同功能。可以通过直接触摸预览缩略图或将轮播UI拖动到所需位置来选择场景。
DepthEffects
此文件夹包含三个密集深度着色器处理示例。
DepthEffects
场景包含一个片段着色器效果,可以从AR相机视图过渡到假彩色深度图。暖色表示深度图中较近的区域。冷色表示较远的区域。
DepthOfFieldEffect
场景包含一个模拟的散景片段着色器效果。这会模糊AR视图中不在用户定义焦距处的区域。通过触摸屏幕在物理环境中设置焦点锚点。焦点锚点是锁定在环境中并始终保持焦点的3D点。
FogEffect
场景包含一个片段着色器效果,在物理环境中添加虚拟雾层。近处的物体比远处的物体更加清晰可见。滑块控制雾的密度。
LaserBeam
这个激光反射场景允许用户通过触摸屏幕任何位置发射缓慢移动的激光束。
这使用了:
DepthSource.GetVertexInWorldSpaceFromScreenXY(..)
函数查找光线投射的3D点ComputeNormalMapFromDepthWeightedMeanGradient(..)
函数根据提供的2D屏幕位置查找表面法线。
MaterialWrap
这个体验允许用户通过触摸改变真实世界表面的材质。它使用深度网格。
OrientedReticle
这个示例使用深度命中测试来获取光线投射屏幕点的3D位置和表面法线。
PointCloud
这个示例使用深度数组在CPU上计算点云。按下更新按钮根据最新的深度数据计算点云。
RawPointClouds
这个示例在CPU上使用深度数组融合点云和原始深度图。拖动置信度滑块可以根据相应原始深度的置信度值改变每个点的可见性。
RainParticles
这个示例使用GPU深度纹理计算雨滴粒子与物理环境之间的碰撞。
Relighting
这个示例使用GPU深度纹理通过AR相机计算性地重新照亮物理环境。靠近人工光源的物理环境区域被照亮,而较远的区域则被变暗。
ScreenSpaceDepthMesh
此示例使用深度网格。在CPU上一次性创建包含规则三角形网格的模板网格。GPU着色器根据GPU深度纹理提供的深度值的重投影,对规则网格的每个顶点进行位移。按下冻结可对网格进行快照,按下解冻可恢复到实时更新的网格。
StereoPhoto
此示例使用深度网格和ScreenSpaceDepthMesh
。冻结网格后,我们缓存当前相机的投影和视图矩阵,让相机围绕一个圆圈移动,并使用缓存的相机图像在深度网格上进行投影映射。按下捕捉创建动画3D照片,按下预览返回相机预览模式。
SnowParticles
此示例使用GPU深度纹理计算雪花粒子与物理环境之间的碰撞,以及每个雪花的方向。
Splat
此示例使用Oriented Reticle
和深度网格在物理环境中放置与表面对齐的纹理贴花。
Water
此示例使用修改后的GPU遮挡着色器,在物理环境中创建人造水的淹没效果。
辅助类
DepthSource
这个类的单例实例包含对深度图的CPU数组和GPU纹理的引用、相机内参以及许多深度查找和坐标转换工具。此类作为MotionStereoDepthDataSource
类的高级封装。
DepthTarget
每个包含DepthTarget
的GameObject
都成为GPU深度数据的订阅者。DepthSource
会自动更新每个DepthTarget
的深度数据。场景中必须至少存在一个DepthTarget
实例,DepthSource
才能提供深度数据。
MotionStereoDepthDataSource
此类包含低级操作和对深度数据的直接访问。仅供高级开发人员使用。
用户隐私要求
您必须prominently披露使用Google Play Services for AR(ARCore)以及它如何收集和处理数据。这些信息必须易于最终用户访问。您可以通过在主菜单或通知屏幕上添加以下文字来实现:"本应用程序运行在Google Play Services for AR(ARCore)上,由Google LLC提供并受Google隐私政策管辖"。
相关出版物
请参阅https://augmentedperception.github.io/depthlab/,了解我们在ACM UIST 2020上发表的论文、补充材料和演示:"DepthLab: Real-Time 3D Interaction With Depth Maps for Mobile Augmented Reality"。
参考文献
如果您在研究中使用ARCore Depth Lab,请按以下方式引用:
@inproceedings{Du2020DepthLab,
title = {{DepthLab: Real-time 3D Interaction with Depth Maps for Mobile Augmented Reality}},
author = {Du, Ruofei and Turner, Eric and Dzitsiuk, Maksym and Prasso, Luca and Duarte, Ivo and Dourgarian, Jason and Afonso, Joao and Pascoal, Jose and Gladstone, Josh and Cruces, Nuno and Izadi, Shahram and Kowdle, Adarsh and Tsotsos, Konstantine and Kim, David},
booktitle = {Proceedings of the 33rd Annual ACM Symposium on User Interface Software and Technology},
year = {2020},
publisher = {ACM},
pages = {829--843},
series = {UIST '20}
doi = {10.1145/3379337.3415881}
}
或
Ruofei Du, Eric Turner, Maksym Dzitsiuk, Luca Prasso, Ivo Duarte, Jason Dourgarian, Joao Afonso, Jose Pascoal, Josh Gladstone, Nuno Cruces, Shahram Izadi, Adarsh Kowdle, Konstantine Tsotsos, and David Kim. 2020. DepthLab: Real-Time 3D Interaction With Depth Maps for Mobile Augmented Reality. Proceedings of the 33rd Annual ACM Symposium on User Interface Software and Technology (UIST '20), 829-843. DOI: http://dx.doi.org/10.1145/3379337.3415881.
我们还要感谢Levana Chen、Xinyun Huang和Ted Bisson将DepthLab与AR Foundation集成。
附加信息
您可以根据Apache 2.0许可证使用此软件。