https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

导读:开发者们在陆续收到HoloLens开发者版的同时,也都着手了HoloLens应用的开发工作。本文作者从空间映射、场景匹配、自然交互等核心特性开始,以实践详解了如何使用Unity引擎开发一个简单的HoloLens应用,并对自己的开发经验进行总结和分享。

  HoloLens概述

  经历数个月的期待与等待,笔者终于拿到了预订的HoloLens开发者版本套件。作为市面上第一款发售的AR/MR设备,HoloLens开发者版本具有很多独特的黑科技。今天,我们就来了解HoloLens的开发特性(参见图1应用场景)。

  

  图1 Hololens应用场景

  空间映射

  借助微软特殊定制的全息处理单元(HPU),HoloLens实现了对周边环境的快速扫描和空间匹配。这保证了HoloLens能够准确地在真实世界表面放置或展现全息图形内容,确保了核心的AR体验。

  场景匹配

  HoloLens设备能存储并识别环境信息,恢复和保持不同场景中的全息图像对象。当你离开当前房间再回来时,会发现原有放置的全息图像均会在正确的位置出现。

  自然交互

  HoloLens主要交互方式为凝视(Gaze)、语音(Voice Command)和手势(Gesture),这构成了HoloLens的基本输入要素。同时传统的键盘鼠标等设备也被支持,自然的交互方式更贴近人类习惯,提高了交互效率。

  通用应用

  HoloLens平台的操作系统为Windows Holograpic,同样基于Windows 10定制。所以Windows 10 UWP通用应用程序可以顺利地在HoloLens上运行。这不仅降低了研发和迁移成本,也让开发效率大幅提升。

  当然,说了很多HoloLens的特性和优点后,开发者版本也存在一些亟待解决的问题,比如视野较窄、凝视体验不佳、抗光线干扰弱和重量续航等。但瑕不掩瑜,HoloLens带来了真正的混合现实体验,拥有着强烈的冲击感,未来将大有作为。

  开发一个HoloLens应用

  在了解HoloLens设备后,我们来试着开发一个简单的HoloLens应用,当然你也可以开发一个传统的UWP应用。这里我们则采用Unity引擎来构建应用,使用Unity开发是官方推荐的做法。

  开始之前

  确保正确配置了开发环境,需安装以下工具和SDK:

  Visual Studio 2015 Update 1及以上版本;Windows 10 SDK 10586及以上版本;HoloLens模拟器,如图2;Unity HoloLens技术预览版。

  以上工具和SDK均可在微软官方网址获取,详细教程可以访问:https://developer.microsoft.com/en-us/windows/holographic/install_the_tools。

  

  图2 HoloLens模拟器

  集成HoloToolkit-Unity项目

  在创建了标准Unity项目之后,我们需要集成微软官方提供的HoloToolkit-Unity项目。HoloToolkit-Unity是微软官方的开源项目,用于帮助开发者快速开发HoloLens应用,能够快速为项目集成基本输入、空间映射和场景匹配等特性。以下是此项目的结构和内容分析,如图3。

  Input目录

  GazeManager.cs用于快速集成凝视射线特性;GestureManager.cs用于快速集成手势识别特性;KeywordManager.cs用于快速集成语音命令特性;CursorManager.cs用于快速集成可视化凝视组件。

  Sharing目录

  Sharing Prefab组件用于快速集成场景共享特性。

  SpatialMapping目录

  SurfacePlane Prefab组件用于描述和渲染真实世界表面;SpatialMapping Prefab组件用于快速集成空间映射特性;RemoteMapping Prefab组件用于快速集成远程空间映射信息导入特性;

  SpatialSound目录

  UAudioManager.cs用于快速集成空间声音特性。

  Utilities目录

  Billboard.cs用于实现跟随用户视线特性;Tagalong.cs用于实现跟随用户移动特性;Main Camera Prefab组件用于快速集成HoloLens标准主摄像机。

  

  构建场景

  新建空白场景后,我们需要删除原有的Main Camera对象,同时从HoloToolkit目录中拖拽一个Main Camera Prefab组件到场景中,如图4,这样就集成了满足HoloLens需求的基本主摄像机。对于HoloLens,将主摄像机渲染背景设为纯色,颜色设为RGBA(0,0,0,0)。因为任何纯黑的颜色将会被HoloLens渲染为透明,以达到不遮挡现实世界的目的。此外,HoloLens建议摄像机视角近距离为0.85,这个距离最符合真实人眼的体验。同时主摄像机位置必须重置为世界零点,即xyz(0,0,0),任何全息图像将会以此为原点在周边世界中绘制出来。

  

  图4 设置主摄像头

  然后点击“Create Empty”创建一个空游戏对象,并将其命名为Input,如图5。为Input对象添加核心脚本组件,分别为GazeManager.cs、GestureManager.cs、HandsManager.cs和KeywordManager.cs。这样就集成了以上命令三大核心特性,对于凝视射线、手势识别和语音命令功能,均建议使用单例来进行管理,这样可以避免功能混乱。同时为凝视设置可视化的指针,可以提高用户的交互体验和效率。

  

  图5 集成输入组件

  接下来集成可视化凝视组件,从HoloToolkit目录下拖拽CursorWithFeedback Prefab组件到场景中,如图6。这样当凝视在全息对象时,其表面会出现可视化凝视组件。当用户手势被识别到时,会出现一个蓝色的手掌图像,能够贴心地告诉用户可以操作了。

  

  图6 集成凝视组件

  创建一个Cube对象和一个新的C#脚本,命名为HoloTest.cs。Cube作为我们的全息图像主体,将它的Transform参数设为如图7所示。这样Cube的位置方便我们近距离观察其实际变化情况,你也可以根据自己偏好来放置它。

  

  图7 设置Cube的Transform参数

  HoloTest.cs脚本的功能为随机更换对象的材质颜色,遵循GestureManager.cs中预设的OnSelect消息名称,HoloTest.cs脚本中将会在OnSelect方法中实现此功能代码如下:

  publicvoidOnSelect() { //随机变换物体颜色gameObject.GetComponent<MeshRenderer>().material.color = newColor(Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f, Random.Range(0, 255) / 255f); }

  进入Input组件检视选项卡,为KeywordManager.cs组件配置语音命令。图8语音命令触发时将会执行相应的组件行为。本例中,当我说出“test”时,机会即会Cube的OnSelect方法,来随机改变Cube颜色。

  

  图8 设定语音关键词行为

  编译项目

  为了满足HoloLens的需求,我们需要在Player Settings里面开启Virtual Reality Support,并在下拉列表中选中Windows Holographic,如图9。只有这样HoloLens才会将此应用渲染为3D应用,这一点十分关键。

  

  图9 添加HoloLens支持

  同时从工具栏Edit→Project Settings→Quality选项卡中,将UWP平台默认画质设为Fastest,如图10。这是为了降低性能开销,官方推荐帧率为60fps。

  

  图10 设定默认画质

  如图11,Build Settings视图中选择目标平台为Windows Store,SDK为Universal 10,点击Build按钮开始编译UWP项目。

  

  图11 编译Unity项目

  部署调试应用

  使用Visual Studio打开编译后的UWP项目,在Debug选项上设置如图12所示。

  

  图12 设置Debug选项

  连接HoloLens到PC,完成Build和Deploy后,我们在HoloLens中打开此应用。实际效果如图13所示。当我使用手势点击Cube时,它会随机变化颜色;而当我说出语音命令“test”时,Cube仍会正常的变换颜色,这完全符合我们的预期。

  

  图13 实际效果图

  HoloLens开发总结

  使用Unity引擎开发HoloLens应用是非常容易的事情,大部分流程与开发UWP项目并无不同。但仍有不少需要注意的雷区和特殊要求,以下就是部分要注意的部分:

  Main Camera一定要按照官方要求配置,背景纯色且RGBA值为(0,0,0,0),这样才能避免遮挡现实内容;Gaze凝视特性需要我们使用Raycast来实现,注意处理射线未命中目标情形,默认凝视最远距离为15米,若是未击中物体,使用时可能会出现空引用异常;

  3 . 手势识别、拍照和语音命令等均需使用Windows特有API,空间映射和场景匹配需要使用HoloLens特有API;其他很多细节上的体验,例如可视化凝视组件、目标区域可视化指引组件等,使用它们来给用户提示,可以帮助用户理解应用操作方法,提高使用体验。

  最后,AR/MR技术独特的交互体验与开发特性,代表了未来自然交互的发展方向,相较于目前成熟的VR技术,它们具有更光明的发展前景和更广阔的用途。无论是微软还是Magic Leap,它们无疑会是未来市场的引领者,而目前也是我们学习的黄金阶段,能够迎头赶上这波浪潮,对于相关从业者具有重要的意义。

  作者简介:

  张昌伟,全栈工程师,微软最有价值专家。专注于iOS和.NET平台开发技术,首批AR开发者,目前全职从事HoloLens开发。

使用Unity开发HoloLens应用的更多相关文章

  1. HoloLens开发手记 - Unity development overview 使用Unity开发概述

    Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必 ...

  2. (二)Hololens Unity 开发入门 之 Hello HoloLens~

    学习源于官方文档 微软官文~ 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要 ...

  3. Hololens开发笔记之使用Unity开发一个简单的应用

    一.Hololens概述 Hololens有以下特性 1.空间映射借助微软特殊定制的全息处理单元(HPU),HoloLens 实现了对周边环境的快速扫描和空间匹配.这保证了 HoloLens能够准确地 ...

  4. (一)Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10)

    (一)Hololens Unity 开发环境搭建(Mac BOOTCAMP WIN10) 系统要求 64位 Windows 10 除了家庭版的 都支持 ~ 64位CPU CPU至少是四核心以上~ 至少 ...

  5. (二)Hololens Unity 开发之 语音识别

    学习源于官方文档 Voice input in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (二)Hololens Unity 开发之 语音识别 Hol ...

  6. (四)Hololens Unity 开发之 凝视系统

    学习源于官方文档 Gaze in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 HoloLens 有三大输入系统,凝视点.手势和声音 ~ 本文主要记录凝视 ...

  7. (五)Hololens Unity 开发之 手势识别

    学习源于官方文档 Gestures in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (五)Hololens Unity 开发之 手势识别 HoloLe ...

  8. (三)Hololens Unity 开发之 语音识别

    学习源于官方文档 Voice input in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 (三)Hololens Unity 开发之 语音识别 Hol ...

  9. Unity开发概览(HoloLens开发系列)

    本文翻译自:Unity development overview 要开始使用Unity创建全息应用,点此安装包含Unity HoloLens技术预览的开发工具.Unity HoloLens技术预览基于 ...

随机推荐

  1. (转)DataTable添加行出现“该行已经属于另一个表”的错误!

    1 DataTable dt1 = new DataTable(); DataTable dt2 = new DataTable(); //为dt1创建结构 DataColumn pName = ne ...

  2. 一个利用Dataflow实现的Actor

    最近进行并发数据处理,学习到了 Actor模型,其中最简单的实现方式是一位大牛利用Dataflow实现的. 大牛的方案:http://www.jayway.com/2013/11/15/an-acto ...

  3. eclipse 使用maven 创建纯spring mvc项目

    接着eclipse 使用maven 创建web3.1项目 创建完成后, 讲spring mvc加入到项目中 先修改pom.xml文件 注意红色字部分 <project xmlns="h ...

  4. mongo设计(一)

    原文:http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1 By Wil ...

  5. 没有产品,没有用户的,绝对不要浪费时间去联系风投——没有过home run的创业人,想办法先做出产品,找到少量用户,没有任何销售成本

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Kuan Huang链接:http://www.zhihu.com/question/19641135/answer/1353 ...

  6. POJ 3484 Showstopper(二分答案)

    [题目链接] http://poj.org/problem?id=3484 [题目大意] 给出n个等差数列的首项末项和公差.求在数列中出现奇数次的数.题目保证至多只有一个数符合要求. [题解] 因为只 ...

  7. Android 捕捉HOME键

    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HO ...

  8. #include <string.h>

    1 _memccpy 2 _memicmp 3 _strlwr 4 _strrev 5 _strset 6 _strupr 7 memccpy 8 memchr 9 memcpy 10 memicmp ...

  9. 全国计算机等级考试二级教程-C语言程序设计_第13章_编译预处理和动态存储分配

    free(p);//释放内存 p = NULL;//软件工程规范,释放内存以后,指针应该赋值为空 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h ...

  10. hdu 5583 Kingdom of Black and White(模拟,技巧)

    Problem Description In the Kingdom of Black and White (KBW), there are two kinds of frogs: black fro ...