HoloLens开发手记 - 入门学习阶段总结

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

 

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;app

 

摄像机 Camera

 

根据沉浸式全虚拟的VR体验要求,因此咱们见到VR独特的摄像机视角,包括两个如出一辙内容的视口。ide

 

 

VR摄像机视图oop

 

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

 

 

主摄像机推荐设置学习

 

Gaze凝视射线

 

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

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

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表明了射线集中地全息对象

       }

}

 

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

 

 

 

手势识别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,他们无疑会是将来市场的引领者,而目前也是咱们学习的黄金阶段,可以迎头遇上这波浪潮,对于相关从业者具备重要的意义。

相关文章
相关标签/搜索