伴随着数月的期待,终于拿到了预订的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. pymysql 读取数据库没有字段

    import pymysql # 打开数据库连接db = pymysql.connect("localhost", "root", "root&quo ...

  2. Pandas数据的去重,替换和离散化,异常值的检测

    数据转换 移除重复数据 import pandas as pd import numpy as np from pandas import Series data = pd.DataFrame( {' ...

  3. [Solution] 973. K Closest Points to Origin

    Difficulty: Easy Problem We have a list of points on the plane. Find the K closest points to the ori ...

  4. Pains and Sickness 学习笔记

    Headaches can be very painful and can last for a long time. If you have a headache, your head hurts. ...

  5. React-router4 第八篇 ReactCSSTransitionGroup 动画转换

    https://reacttraining.com/react-router/web/example/animated-transitions 动画转换这么高级,其实是又引入了一个组件,没什么特别, ...

  6. vi/vim 文字处理器常用命令

    目录 vi 与vim vi 的三种模式 vi 光标移动 vi 搜索与替换 vi 删除 vi 复制 vi 粘贴 vi 其他 vi 进入编辑模式 vi 命令行命令 vim 附加功能 vi 与vim vi是 ...

  7. Loadrunner登录判断

    loadrunner判断登录是否成功,以下方法可以解决:1.利用添加检查点web_reg_find函数的方法---------------------------- lr_start_transact ...

  8. 描述符__get__,__set__,__delete__

    描述符__get__,__set__,__delete__ # 描述符:1用来代理另外一个类的属性 # __get__():调用一个属性时,触发 # __set__():为一个属性赋值时触发 # __ ...

  9. HDU 3666.THE MATRIX PROBLEM 差分约束系统

    THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  10. [Python] Window机器上同时安装Python 2 和 Python 3,如何兼容切换使用?

    不论python2还是python3,python可执行文件都叫python.exe,在cmd下输入python得到的版本号取决于环境变量里哪个版本的python路径更靠前. 切换的方法有3种(方法3 ...