APP下载

一种实用的移动AR 实验解决方案

2020-09-29谢伙生

实验技术与管理 2020年7期
关键词:阴影光源光照

谢伙生,杨 铮,林 晶

(1. 福州大学 数学与计算机科学学院,福建 福州 350116;2. 福州大学 网络信息安全与计算机技术国家级实验教学示范中心,福建 福州 350116)

增强现实(augmented reality,AR)技术作为一门新兴技术,在许多领域都有着巨大的潜力和应用价值,比如教育领域、医疗领域、娱乐游戏领域等[1-3]。近年来随着移动设备飞速发展,因其具有易携带、易使用、显示效果较好等特点,使得基于移动设备开发的 AR技术逐渐成为发展主流,这种技术称为移动AR[4-6]技术。

随着人工智能的发展,实验教学中的移动AR实验成为大学计算机相关专业的新兴课程,熟练掌握移动AR开发技术已成为大学生未来就业、创业所要具备的技能之一。因此,移动AR实验的教学地位越来越重要,但传统移动AR实验的底层开发实现较复杂,不便于AR技术的普及,同时移动AR实验一般也较少利用移动设备的传感器数据进行结合开发。针对该问题,本文提出一种更为直观和便捷的移动AR实验解决方案。为了验证该方案的有效性,使用光照一致性的移动AR实验进行验证。由于构建光照模型的方法较复杂,算法计算量较大,目前关于光照一致性的AR实验研究大多集中在PC端,较难在移动端中直接使用[7-8]。本文利用移动设备的光传感器探测光源方向,通过Android Studio和Unity3D的通信机制传送传感器数据,同时结合EasyAR SDK开发实现了虚实光照一致的移动AR实验案例。

1 Unity3D和AR SDK

Unity3D是一个功能丰富的轻量级图形渲染引擎,主要用于游戏的开发,是一个可跨平台的游戏引擎,支持基于Android、iOS、PC、Linux、tvOS等多种平台发布,可以使用户轻松实现图形渲染、三维动画和脚本编辑[9]。Unity3D界面包括五大基础模块:层级视图(hierarchy)、场景(scence)、游戏(game)、项目(project)、检测面板(inspector),这些模块使用户方便、直观地开发3D应用项目。同时,Unity3D还具有丰富的 Asset Store,可以下载资源并导入到Unity3D项目中,也可以使用外部资源导入。Unity3D支持 JavaScript、C#、Boo 3种脚本语言开发,其中C#具有强大的.NET库做支撑并且有着良好的跨平台性,已逐渐成为Unity3D所推荐的开发语言。

国内外有着许多优秀的 AR SDK,传统的有ARToolkit、ARTag[10]和 NyARToolkit[11]等。ARToolkit是最早流行起来的开源AR工具,使用C/C++编辑语言。NyARToolkit基于ARToolkit移植,具有良好的兼容性,支持 Java语言和 C#。现如今国内外研发了多种基于Unity3D的AR SDK,比如有Vuforia SDK、Wikitude AR SDK、HiAR SDK、EasyAR SDK[12]等。相较于传统的AR SDK,使用基于Unity3D的AR SDK将极大地减少开发难度。Vuforia是美国公司Qualcomm发布的一款移动终端AR开发引擎。EasyAR SDK作为国内自主研发的一款增强现实工具包,已经具备完善的Target种类和较便捷的识别图设置模式,同时具有单目标识别、多目标识别、3D物体识别、云端服务等多种功能以及丰富的 API和完备的用户手册,深受国内外开发者的青睐。

Unity3D是一个具有可视化操作界面的专业游戏引擎,Android SDK又提供了开发移动端应用的各种组件[13],这些都极大地满足了移动AR应用的各项需求。移动AR应用中通过增加虚实光照一致性能,较好地消除了虚拟模型显示的突兀感,增强了虚拟信息与现实场景的融合。

2 移动AR实验的解决方案

实现一个结合传感器数据的移动AR实验需要以下步骤:1)结合 Unity3D和 AR SDK搭建基本 AR实验环境;2)在Android Studio中获取移动端传感器数据;3)Unity3D工程与Android Studio工程相结合进行通信、传输传感器数据。

2.1 结合Unity3D和AR SDK搭建基本AR实验环境

本文采用EasyAR SDK开发,它是国内自主研发的一款免费增强现实开发工具,能够在Android、iOS、PC等多平台实现。具备单目标识别、多目标识别、3D物体识别、云端服务等功能,是一款完善的增强现实开发工具[14]。利用EasyAR SDK在Unity3D中搭建基本AR实验环境的步骤如下:

1)在EasyAR官网下载EasyAR SDK for Unity工具包,并注册账号创建License key。

2)将EasyAR.unitypackage资源包导入(Import)Unity3D中,包内组件如图1所示。

图1 导入EasyAR SDK到Unity3D

3)移除层级视图中初始摄像机Main Camera,添加Prefabs文件夹中的AR相机组件EasyAR_Startup,在其检测面板中输入1)中获取到的License key。

4)添加ImageTarget组件,在该组件下创建的3D物体是作为虚拟显示模型,添加虚拟光源组件VirtualLight,如图2所示。

图2 各组件层级视图

5)选择 ImageTarget组件,在检测面板中设置Marker图标,输入Marker的path和name属性并调整位置和大小。Marker图标路径位于StreamingAssets文件夹下,如图3所示。

图3 设置Marker图标属性

6)选择菜单File>Build Settings设置Android运行 模 式 , 点 击 Player Settings>Other Settings>Identification填写 SDK包名,点击 Build即可生成Android APK。

2.2 Android Studio中获取传感器数据

Google Android API上的传感器访问通过传感器管理器类SensorManager进行,并使用SensorListener来检索测量[15]。SensorManager是用来获取传感器服务和选择传感器类型。SensorListener是传感器监听器,用于监听传感器数据的变化。Sensor是传感器信息抽象类,通过getType()方法获取不同的传感器类型,包括光传感器、方向传感器、磁场传感器、重力加速度传感器等。获取的传感器数据以长度为3的数组形式存在。常见传感器表示方法如表1所示,不同的传感器类型如表2所示。

表1 常见的传感器表示方法

表2 常见类型传感器表示方法

2.3 Unity3D与Android Studio结合进行通信传输

Android Studio是一款Android集成和调试的开发工具,Unity3D导出的 Android工程可以很完美地结合到Android Studio工程中进行二次开发并传输数据。图4为Unity3D和Android Studio通信机制图。

图4 Unity3D和Android Studio通信机制

如图4所示,Android Studio是通过com.unity3d.player包里提供的函数和类调用Unity3D方法。其中UnityPlayer.java是Android Studio中图像渲染和信息传递功能的重要类,UnityPlayer.java类中封装有函数UnitySendMessage (gameObject,fuction, param),该函数用于Android Studio和Unity3D之间通信传输,输入的3个成员变量分别为游戏对象、需要进行通信的函数名以及需要传递的数据参数。Unity3D是通过UnityEngine工具包里所提供的各类API调用Android Studio方法,主要通过 AndroidJavaObject对象及AndroidJavaClass类来实现。AndroidJavaObject是Android Java对象,通过构造函数实例化Android类,并进行函数及成员变量的调用。实例化方式:AndroidJavaObject obj=new AndroidJavaObject(“className”)。AndroidJavaClass是 Android Java 类,里面包含着各种java类的操作。

Unity3D与Android Studio相结合的具体实现步骤如下:

1)在Unity3D中设置Player Settings导出安卓工程。以Unity3D 5.5.0版本为例,如图5所示,将Build System 选项设置为 Gradle,勾选 Export Project,点击Export导出项目。导出后的目录结构如图6所示。

图5 Unity3D中设置导出Android工程

图6 Unity3D导出工程目录

2)在Android Studio中新建一个项目,将Unity3D导出工程中的文件全部替换到Android Studio中相应的文件夹中,包括 java、jniLibs、assets、res文件夹以及AndroidManifest.xml配置文件。配置好的文件目录如图7所示。这样就初步完成了一个Unity3D结合到 Android Studio中的工程搭建。需要注意的是,Unity3D端导出的文件夹只有在首次配置中才需要全部替换,而后当需要修改Unity3D工程中的文件时只需要将Unity3D导出工程中的 assets->bin->Data文件替换到Android studio对应的Data文件夹即可。路径如图8所示,图8(a)为Unity3D端Data文件路径,图8(b)为Android Studio端Data文件路径。

图7 Android Studio配置好的文件目录

图8 文件路径

3 光照一致的移动AR实验案例

AR技术有别于VR技术,AR技术更注重在真实世界中叠加虚拟信息。虚拟信息高度融合于现实世界主要体现为几何一致性、光照一致性和时间一致性[16]。其中光照一致性指的是在虚拟世界中的光照强度、方向等信息与现实世界中的光源信息保持一致,从而消除虚拟模型显示的飘浮感,这是影响虚拟模型显示效果的重要因素。

本文利用移动AR解决方案,实现了带有虚实光照一致性效果的移动AR实验。通过转动手机,利用移动设备自带的光传感器采集光强数据,探测到最大光强后近似将摄像头的位置方向当作现实场景中的光源位置方向,将摄像头位置的旋转数据作为虚拟场景中的光源位置的旋转数据更新光源方向,最终渲染出三维模型及阴影。实验能实时渲染与现实光照方向较为一致的阴影并与虚拟三维模型融合,达到虚拟场景和现实场景光照一致的视觉效果。

3.1 案例实验架构

利用Unity3D和Android Studio结合开发并通过Android传感器采集现实世界光源信息,其中Marker图的追踪识别和摄像机姿态的获取是利用 EasyAR SDK工具包来实现,本案例实验的整体架构如图9所示。Android Studio端主要负责光传感器的注册和监听,获取真实场景中Marker图周边环境的光强值并迭代出最大的光照强度,将最大光强数据传递给Unity3D端并同时触发改变虚拟光源的函数;Unity3D端主要负责EasyAR SDK图像识别追踪包的搭建和使用,获取相机标定过程中AR摄像机的旋转数据,同时开启陀螺仪监测功能,获取手机在三维空间的姿态数据。根据追踪结果的不同使用不同的旋转数据赋值给虚拟光源,改变虚拟光源在虚拟世界中的方向位置,渲染三维模型和光照方向正确的阴影效果,最后融合到真实场景中。

图9 案例实验架构

3.2 案例实验流程

基于光照一致性的移动AR案例实验流程如图10所示,该实验基于Android Studio端和Unity3D端同时进行。Android Studio端首先初始化注册光照传感器,同时监听光照强度变化,对比当前光强值是否大于最大光强值,若小于最大光强值则不做操作继续监听;若大于最大光强值则更新最大光强数据,将光强值进行通信传输传递给Unity3D端。Unity3D端利用EasyAR SDK搭建AR环境,主要负责摄像头图像帧的获取,对Marker标记进行检测和识别。Unity3D端的函数每一帧都在更新,如果Android Studio端监听到最大光强值改变时则会触发Unity3D端更改虚拟光源方向的函数。在函数中判断Marker标记的检测匹配是否成功,如果成功,获取当前手机AR相机姿态旋转数据后赋值给虚拟光源组件的旋转值;如果失败,则获取手机陀螺仪数据并矫正手机当前姿态,当Marker标记识别成功后更新虚拟光源组件的位置和光照强度,最终渲染阴影输出模型融合效果。

图10 案例实验流程图

3.3 案例实验的结果与分析

本实验使用Android Studio和Unity3D结合开发,使用Java程序语言开发生成APK,采用Android手机运行测试,具体运行环境软硬件配置如表3所示。

表3 运行环境配置表

采取单个类似聚光灯光源进行实验,虚拟模型采用现实场景中常见的物体形状,并与现实世界中类似的物体模型进行比较。分别在模型追踪成功和失败的2种条件下转动手机采集周边光照信息,观察阴影实时变化情况。

1)阴影效果测试。

采取简单球体模型作为虚拟信息,一般的AR实验无阴影效果如图11(a)所示,虚拟模型加了阴影后的效果如图11(b)所示,通过对比可以看出,加了阴影后的模型显得更加逼真,减少了模型的漂浮感,增强了用户的视觉体验。

图11 阴影效果对比

2)阴影实时性和模型光照强度动态变化测试。

图12为手机逆时针绕着Marker图中心位置转动时阴影和模型的变化情况,光源位置在Marker图的右侧上方。图12(a)是摄像头打开的初始状态,此时还未转动手机进行光照强度的探测,实验默认此时为最大光强位置,渲染该方向阴影;当手机逆时针向右移动到图12(b)时,实验探测到更大的光强值,更新了阴影方向及模型光照亮度;当手机再次移动到图12(c)时探测到当前环境的最大光强,实验显示模型亮度达到最大并且重新渲染更新阴影方向;此时再次转动手机探测不到更大的光强值,实验保持图12(c)时的模型和阴影方向状态的渲染。实验可以看出虚拟模型的阴影方向和模型的亮度都是根据现实场景中的光照情况实时变化的。实验结果表明:该方案能够较快地实时更新阴影的方向,并且更新模型的光照强度状态,运行较流畅。

图12 阴影实时性与模型光照强度动态变化测试

3)阴影方向准确性测试。

测试使用不同形状的虚拟模型与现实世界中相近的物体进行比较。光照一致性的实验渲染效果如图13所示,图13(a)选用球体模型,图13(b)选用柱体模型,分别在现实场景探测光照强度后实时渲染阴影。实验结果表明:Android光传感器能够敏感地探测周边光强变化,虚拟物体能够较好地渲染与真实物体方向较一致的阴影,达到虚实光照一致的目的。

图13 光照一致性的实验阴影效果

4 结语

利用Unity3D能够较为快速地实现AR实验,同时与Android原生开发结合能够较轻松地实现信息采集和数据通信,极大地降低开发难度,便于实验教学和 AR技术的普及。本文结合 Unity3D和 Android Studio同时使用EasyAR SDK设计实现了一个更为直观和便捷的移动AR实验解决方案,并通过该解决方案实现了光照一致性的移动AR实验,通过与现实场景中的物体光照效果比较实验,表明该方案能够渲染出与现实场景中较为一致的阴影方向,实时性较好,系统较流畅,能达到预期效果。

猜你喜欢

阴影光源光照
节能环保 光照万家(公益宣传)
光源改变光环境
当幻想的光照进童心世界
你来了,草就没有了阴影
隐蔽的力量
让光“驱走”阴影
绿色光源
两种LED光源作为拟南芥生长光源的应用探究
阴影魔怪