作者|张晨单位:中国移动智能家居运营中心实验室简介随着移动技术的发展和5G技术的普及,AR/VR行业也迎来了新的机遇春天。由于AR/VR行业的应用需要大量数据的计算和渲染,以及配套硬件设备的普及,所以为了让你我有更好的观感,对硬件和硬件的要求软件都很高。然而,随着技术的发展,这一切都成为可能。本文将带你了解AR/VR在移动开发中的一些技术方案。Part01AR开发的技术难点在AR技术越来越普及的今天,很多一线互联网公司都组建了自己的团队,开发独立的AR框架。以下是一些常见的AR技术平台和运营它们的公司。那么AR开发的技术难点是什么?界面问题:缺乏通用的UI隐喻虽然人们知道他们可以用AR做什么,但他们不确定如何使用这种突破性技术,以及如何使用通用语言来帮助梦想成真。AR的困难在于它是一种全新的技术,并没有真正受益于任何界面隐喻。我们不能借鉴先例,也不能没有太多的背景知识。例如,如何反映真实环境、虚拟环境,让用户了解手机、扫描环境、交互或观看虚拟物体、提示动作避免危险等,还没有形成普遍直观的UI习惯.如果不解决UI的隐喻,就很难抓住AR给我们带来的独特数字机会。能耗问题:功耗大、容易发热目前市场上的CPU和GPU大多是为通用设备开发的,没有专为AR设备开发的专有芯片。因此,目前的CPU尺寸(Size)被小型化了。处理器和图形方面取得了很大进步,但仍未达到使高端AR成为现实的水平。功耗(Power)渲染AR体验的过程非常耗电。事实上,功耗越大,产生的热量就越多,这反过来又会减慢处理器的速度,甚至使其完全短路。设备越小,散热就越慢。内容问题:3D设计门槛高。AR内容的设计需要3D设计知识。目前,具备这种能力的技术人员很少,除非你是专业的动画师、平面设计师、机械工程师或视频游戏制作人,否则很难在这方面有太多经验。Part02ArCore在Android端的应用目前这些方案如何更好的应用到移动开发中?下面以ARCore为例,看看在移动端开发一个AR项目需要做些什么。首先要明确的是,该平台是基于Android的,开发IDE是基于AndroidStudio(需要AndroidStudio3.1或更高版本和AndroidSDKPlatform7.0或更高版本)。其次,我们需要在需要运行AR项目的设备上安装GooglePlay。对于ARCore,大部分的数据计算和算法运算都需要google_play_service的支持,所以升级到最新版本的Google_Play_Services_for_AR_1.31.0_x86_for_emulator.apk非常重要。然后在你的AR项目中找到清单并添加:google.com/ar/devices)。-->…特性支持,并在gradle中导入ARCore支持:implementation'com.google.ar:core:1.31.0'同步后,可以在代码段添加ARCore检测代码:ArCoreApk。可用性availability=ArCoreApk.getInstance().checkAvailability(this);即使AR的GooglePlay服务是随AR必备应用程序一起安装的,使用不受支持的设备的用户也可以从外部来源安装该服务。使用checkAvailability()检查ARCore支持可确保一致的体验。checkAvailability()可能需要查询网络资源以确定设备是否支持ARCore。在此期间它将返回UNKNOWN_CHECKING。为了减少感知延迟和弹出窗口,应用程序应该在其生命周期的早期调用一次checkAvailability()以启动查询,忽略返回值。这样,缓存的结果将在调用maybeEnableArButton()时立即可用。由于AR设备必须使用摄像头,请在使用AR设备前请求并开启摄像头权限:if(!CameraPermissionHelper.hasCameraPermission(this))返回;现在我们准备工作完成后,您可以构建一个ARSession。Part03ARClientDevelopmentARSession是所有AR进程(如运动追踪、环境理解、光照估计等)的集合,在Android中用于管理AR系统的状态和处理session生命周期.官方提供的接口提供了允许应用程序创建、配置、启动或停止会话的方法。最重要的是,它允许应用程序接收允许访问相机图像和设备位置方向的帧。让我们创建一个Session,只需几行代码即可完成。publicvoidcreateSession(){//创建一个新的ARCore会话。session=newSession(这个);//创建会话配置。配置配置=新配置(会话);//在这里执行特定于功能的操作,例如启用深度或打开//对增强面孔的支持。//配置session.session.configure(config);}是不是很简单?同样,要关闭Session,可以直接调用:session.close();。然后我们在Activity中构建一个渲染循环,创建一个GlSurfaceView进行渲染,并实现渲染类。同时创建绘制Mesh需要的渲染类,如planetRender(绘制地面)、BackgroundRenderer(绘制背景)等。在OnSurfaceCreate渲染线程回调中,添加mesh、render、texture的初始化操作,并申请GPU空间。在OnSurfaceChanged回调中,设置渲染缓冲区的视口。在OnDrawFrame中添加每一帧的渲染逻辑,Frameframe=session.update();可以获取当前帧的信息,包括相机信息、RGB图、深度图等。Cameracamera=frame.getCamera();可以获取当前相机状态,比如是否正在跟踪物体,是否跟踪失败等。通过相机的不同状态绘制3D物体可以动态改变3D物体的显示(如位置,大小,旋转、是否被屏蔽等)。Frame还存储了点云、锚点、平面等检测信息。您还可以从相机获取视点信息,重建3D世界,并将上面获取的信息绘制到场景中。在真实的台球桌面上,虚拟出一个圆锥形的物体,这是通过检测得到的平面信息,在平面上添加一个指定位置的锚点,在锚点上绘制一个圆锥体。Part04AR/VR趋势与未来AR和VR设备的普及可能需要一个比较长的过程,包括硬件升级和软件升级,也可能包括消费者需求的升级。因此,前景和市场还是非常被看好的,因为它的发现大大提升了以往体感游戏或交互的体验,让用户随时随地身处各种虚拟场景,获得非常逼真的体验。相信随着移动技术的发展,总有一天每个人都能用上价格实惠、手感不错的AR/VR产品。