伴随着数月的期待,终于拿到了预订的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. Docker 简介,入门

    1.简介 Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行 ...

  2. Pandas分组

    GroupBy技术 分组运算的过程可以用下面的流程图表示出来 import pandas as pd from pandas import Series import numpy as np df = ...

  3. List Set Map的区别

    1.读取频繁选用List 快速访问选取ArrayList,经常进行添加删除工作可以选用LinkList 2.如果你想进行有序的插入那么还是选型List,因为List是一个有序的容器 3.如果你想保证插 ...

  4. java基础 ---- 练习for循环

    -----   使用for循环打印图形 //打印矩形 public class Print { public static void main(String[] args) { for(int i=1 ...

  5. 回溯算法_ BackTracking

     目前还存在的疑问: 1. 所谓的该分支满足条件之后就回退到上一层节点,可是加谁呢? x[i+1]  ?? 加到 N, 不满足target sum条件就返回上一级(同时改变上一级数为 i+1...纵向 ...

  6. Linux驱动之定时器在按键去抖中的应用

    机械按键在按下的过程中会出现抖动的情况,如下图,这样就会导致本来按下一次按键的过程会出现多次中断,导致判断出错.在按键驱动程序中我们可以这么做: 在按键驱动程序中我们可以这么做来取消按键抖动的影响:当 ...

  7. AI制作icon标准参考线与多面板复制

    新建10个25x25像素,色值为RGB的画板 在视图中打开显示网格 打开首选项参考线和网格,间隔和隔线都设为1 新建一个20x20像素前景色为空描边为1像素的正方形 选择对齐选项中的对齐画板,使之与画 ...

  8. TaxonKit - A cross-platform and Efficient NCBI Taxonomy Toolkit

    https://github.com/0820LL/taxonkit Usage: https://bioinf.shenwei.me/taxonkit/usage/

  9. 初级PM要做什么

    首先让我们看下这张图,产品经理进入公司后将要面临着许多工作 或许你有疑问,如果是产品助理的话,上面这么多工作都要去做吗? 其实不然,初级产品经理由于工作经历有限,对行业的研究以及对市场的把控是有视野限 ...

  10. C# 多线程编程,传参,接受返回值

    C# 多线程编程,传参,接受返回值 今天将多线程的知识有回顾了下,总结了几点: 新建一个线程(无参数,无返回值) Thread th = new Thread(new ThreadStart(Prin ...