伴随着数月的期待,终于拿到了预订的HoloLens开发者版本套件。随着VR/AR/MR技术的热潮,国内外均对它们的应用与盈利前景持有积极的预期,这也直接导致了国内外当前投资VR/AR/MR技术的热潮。无论是融资数十亿美元的Magic Leap,还是Facebook、微软等科技巨头布局VR/AR市场,这股热潮不仅出现在风险投资领域,还席卷了消费者市场和智能硬件市场,这无疑引领了下一波互联网产业的爆发,而我们作为技术核心的开发者更不能落下。正如乔帮主所说:“Stay foolish,Stay Hungry”,今天我们就来了解下AR/MR技术的开发特性,本文以微软出品的HoloLens为目标设备。

AR/MR是什么?


VR大家都已经很清楚了,VR即是虚拟现实技术,这意味着沉浸式全虚拟的使用体验。全虚拟沉浸式的体验带了独特的视觉效果,但是由于遮盖现实内容,仍导致了头晕、运动不友好等难以解决的问题。与之相对的则是AR/MR技术,这意味虚拟世界与真实世界交织的视觉体验。从用户使用体验来看,AR/MR无疑是更符合人类自然交互模式,代表了未来更伟大的发展方向。同时在笔者看来,由Magic Leap提出的MR(Mixed Reality)技术其本质与AR(Augmented Reality)技术并无区别,微软目前也在HoloLens文档中大量使用MR技术的说法,故此本文将AR/MR技术视为一体。

AR核心特性


正如上面所说,AR具备与VR截然不同的视觉体验,所以其开发体验也与VR区别较大,下面我们来一起探讨HoloLens的部分核心开发特性。本文使用的开发环境为Unity HoloLens preview beta 14以及Unity Universal Windows Platform Runtime组件,具体的配置细节可看:http://www.cnblogs.com/mantgh/p/5352703.html;

摄像机 Camera

根据沉浸式全虚拟的VR体验要求,所以我们见到VR独特的摄像机视角,包括两个一模一样内容的视口。

VR摄像机视图

然而,AR追求的是自然的用户体验,所以不会遮挡任何真实世界的内容。所以我们并不需要创造两个同样视图内容的摄像头,仍然和传统的桌面、移动端没有太大区别。主要需要适配的内容是背景和视角范围。对于HoloLens,将主摄像机渲染背景设为纯色,颜色设为RGBA(0,0,0,0)。因为任何纯黑的颜色将会被HoloLens渲染为透明,以达到不遮挡现实世界的目的。此外,HoloLens建议摄像机视角近距离为0.85,这个距离最符合真实人眼的体验。同时主摄像机位置必须重置为世界零点,即xyz(0,0,0),任何全息图像将会以此为原点在周边世界中绘制出来。

主摄像机推荐设置

Gaze凝视射线

与VR头戴设备一样,HoloLens同样依赖于设备发出的凝视射线来选中目标。Gaze凝视的作用和PC上的光标一样,配合语音和手势能够实现对全息对象的操纵。作为一个全息应用开发者,你可以使用凝视做到很多事情:

  • 应用可以通过判断凝视射线与全息物体的交叉来判断用户当前在关注什么。
  • 应用可以借助基于凝视射线的手势来实现选中、激活、拖拽或其他对全息物体的交互。
  • 通过凝视射线与空间匹配网格的交叉,应用可以让用户放置全息物体到真实世界的表面。
  • 应用可以知道何时用户没有注视在重要物体的方向,这使得你可以通过图形或者声音提醒将用户带回到正确的方向上。

Unity自带了对射线的支持,能够很好的集成为凝视射线,只需要简单的代码即可:

void Update()

{

       RaycastHit hitInfo;

       if (Physics.Raycast(

               Camera.main.transform.position,

               Camera.main.transform.forward,

               out hitInfo,

               20.0f,

               Physics.DefaultRaycastLayers))

       {

           // 如果射线成功击中一个全息对象

           // hitInfo的point属性代表了射线击中的位置

           // hitInfo.collider.GameObject代表了射线集中地全息对象

       }

}

对于凝视射线,笔者建议使用单例来进行管理,这样可以避免功能混乱。同时为凝视设置可视化的指针,可以提高用户的交互体验和效率。

手势识别Gesture

手势是HoloLens三大基本输入方式之一,其余是语音和凝视。Windows Holographic支持的基本手势为Air-Tap(点击),Hold(长按)和Bloom(绽开)。Air-Tap手势用于选中物体,而Hold手势用于唤出二级菜单,Bloom手势用于唤出开始菜单。

开始菜单

同时我们可以为应用自定义手势,通过GestureRecognizer来识别。下面是基本的手势识别用法:

//初始化手势识别器

GestureRecognizer recognizer = new GestureRecognizer();

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

recognizer.TappedEvent += MyTapEventHandler;

recognizer.HoldEvent += MyHoldEventHandler;

//开始识别

recognizer.StartCapturingGestures();

语音识别Voice Command

语音识别同样是HoloLens重要组成部分,包括我们很熟悉的Cortana,同样能够为我们带来更自然高效的输入体验。

HoloLens的语音识别分为三个部分:

  • 语音命令 KeywordRecognizer:通过关键词来执行动作
  • 语法识别GrammarRecognizer:通过预设的语法来模糊匹配动作
  • 听写 Diction:即语音转文字,用于输入

三个组件中语音命令特性最为常用,配合凝视能够完成绝大部分场景的需求。为了使用语音命令,首先要启用KeywordRecognizer实例,同时要预设好<keyword,action>来源。

KeywordRecognizer keywordRecognizer;

Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

通过<keyword,action>数组来初始化关键词识别器:

keywords.Add("activate", () =>

{

    // 关键词动作

});

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

//开始识别

keywordRecognizer.Start();

在响应事件中做处理,调用识别到的关键词事件。

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)

{

    System.Action keywordAction;

//如果关键词在预设列表中,即执行其2动作

if (keywords.TryGetValue(args.text, out keywordAction))

    {

        keywordAction.Invoke();

    }

}

空间映射 Spatial Mapping

AR技术能实现的关键就是能够识别映射周边世界,这是全息对象与真实表面交互的基础,是AR技术的核心组件。HoloLens借助于微软特殊研发的全息处理单元(HPU 1.0)才能实现空间映射特性,幸运的是我们可以使用空间映射API来对真实世界做交互。

全息处理单元

我们可以利用SurfaceObserver组件来获取控件表面映射信息,下面是基本的操作:

SurfaceObserver surfaceObserver;

 void Start () {

//初始化

     surfaceObserver = new SurfaceObserver();

StartCoroutine(UpdateLoop());

 }

IEnumerator UpdateLoop()

    {

        var wait = new WaitForSeconds(2.5f);

        while(true)

        {

            surfaceObserver.Update(OnSurfaceChanged);

            yield return wait;

        }

    }

每一个空间表面都需要注册其Handle事件,用于实时调整空间映射信息和交互。

private void OnSurfaceChanged(SurfaceId surfaceId, SurfaceChange changeType, Bounds bounds, System.DateTime updateTime)

 {

    //处理空间表面变化

 }

结语


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

HoloLens开发手记 - 入门学习阶段总结的更多相关文章

  1. HoloLens开发手记 - HoloLens真机上手简评

    千呼万唤始出来,终于今天拿到了HoloLens真机. 使用体验 使用自带的应用录制了一段使用视频,如下 设备概览 包装盒 本体 试戴 实际效果 GalaxyExplorer试玩 全息图像贴到现实场景表 ...

  2. HoloLens开发手记 - 应用程序模型 App model

    HoloLens使用Universal Windows Platform (UWP)提供的应用模型.UWP应用模型定义了应用如何被安全和完全地安装.更新.版本控制和移除.它管理了应用生命周期 - 应用 ...

  3. HoloLens开发手记 - 使用HoloLens模拟器 Using HoloLens emulator

    首先下载HoloLens模拟器 HoloLens模拟器运行在没有真机的情况下在你的PC上测试应用,属于HoloLens开发工具系列.模拟器使用了Hyper-V虚拟机.通常通过传感器获取的人体和环境输入 ...

  4. HoloLens开发手记-开发概述Development overview

    开发HoloLens全息应用将使用UWP平台(Universal Windows Platform),所有的HoloLens应用都是Win10通用应用,所有UWP通用应用都可以在HoloLens上运行 ...

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

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

  6. HoloLens开发手记 - Vuforia开发概述 Vuforia development overview

    关于Vuforia,开发AR应用的人基本都会熟悉.之前我也写过一篇关于Vuforia开发的博客:Vuforia AR SDK入门 今天这篇博客则主要是谈谈HoloLens使用Vuforia开发混合现实 ...

  7. HoloLens开发手记 - 开始使用Vuforia Getting started with Vuforia

    Vuforia在6.1版本的Unity SDK里实现了对HoloLens的支持. 查看 Developing for Windows 10 in Unity 这篇文章来了解如何配置Unity和Visu ...

  8. HoloLens开发手记 - 构建2D应用 Building 2D apps

    HoloLens可以让我们在真实世界中看到全息图像内容.但是它本质上还是一台Windows 10设备,这意味着HoloLens可以以2D应用形式运行Windows Store里的大部分UWP应用. 目 ...

  9. HoloLens开发手记 - 使用Visual Studio Using Visual Studio

    不论你是否使用DirectX或Unity来开发全息应用,你都会使用Visual Studio 2015来进行调试和部署应用.在本部分,你将会学习以下内容: 如何通过Visual Studio将你的应用 ...

随机推荐

  1. 关于extern的使用

    学的时候不认真总结,用的时候就一堆bug. 上回也是调extern调了半天,今天又犯老毛病. data 比如说是要用到的的在main函数中不断刷新的量.那么这个unsigned int data 要写 ...

  2. JPA和SpringData知识梳理

    一. JPA,全称Java Persistence API,用于对象持久化的API,定义一套接口,来规范众多的ORM框架,所以它是在ORM框架之上的应用. 下面主要讲JPA在Hibernate基础上的 ...

  3. SpringMVC 中模型数据处理中的@ModelAttribute 和@SessionAttributes使用细节

    @ModelAttribute 运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用(在方法中修改了入参值在view层得到的还是 ...

  4. Windbg断点调试

    [文章主题] Windbg是Windows驱动调试的重要软件,也是必须学习的软件,前面的博客介绍了一些双机调试的环境配置,只要按照我所说的步骤一步步下来就可以完成环境搭建. 本文主要介绍如何调试sys ...

  5. mysql 查询结果集按照指定的字段值顺序排序

    mysql 查询结果如果不给予指定的order by ,那么mysql会按照主键顺序(innodb引擎)对结果集加以排序,那么最后的排序可能就不是你想要的排序结果. 举个例子,我要按照前端传过来的mo ...

  6. JavaScript实现观察者模式

    首先: 观察者模式是软件设计模式的一种,它

  7. rhce 第十一题 挂载NFS共享

    挂载NFS共享 在system2上挂载一个来自 system1.group8.example.com 的NFS共享,并符合下列要求: /public 挂载在/mnt/nfsmount目录上 /prot ...

  8. convert 函数的使用

    先说问题:今天项目中很多模块出现了一个集体性的问题,时间检索时选择同一天 检索不出数据(表中数据确实存在),其实这个问题在做东西的时候领导说过,记忆中我解决了,但是后来写代码可能把这个问题忘记了! 其 ...

  9. Solidity的地址 数组如何判断是否包含一个给定的地址?

    Q: given address[] wallets. What is the correct method to check that the list contains a given addre ...

  10. Win10电脑系统使用技巧

    现如今,电脑已经成为我们不可或缺的伙伴,陪伴着我们的工作.娱乐和生活,而Windows10在大家使用的电脑中占据了大多数,但是很多的小伙伴对它的许多功能并不真正了解,今天小编就带大家了解一下这些技巧, ...