查看原文
其他

Unite 2017 | 运用Unity开发HoloLens应用实战技巧(下)

2017-06-27 鲍健运 Unity官方平台

昨天我们分享了《运用Unity开发HoloLens应用实战技巧(上)》,今天下篇将讲解Unity开发HoloLens应用的全息模拟器与交互设计。


下面附上本次演讲的现场视频(时长30分钟,流量党请注意):


https://v.qq.com/txp/iframe/player.html?vid=w0517ktpo7l&width=500&height=375&auto=0


全息模拟器(Holographic Emulation)是一个新功能,可以大幅度减少Unity开发全息应用的迭代时间。Microsoft HoloLens的开发者们将可以直接使用Unity编辑器进行原型设计、调试和迭代设计,不必再花费过长的时间进行发布构建。并且给没有硬件设备的开发者也提供了很大的便利。它拥有两种模式:模拟模式和远程模式。


温馨提示: 如果要使用Unity编辑器自带的全息模拟器,操作系统必须为Windows 10 Anniversary版本。


模拟模式(Simulate in Editor)


Room

Room就是模拟场景所在的房间。一共5个选项,分别是:DefaultRoom、Bedroom1、Bedroom2、GreatRoom和LivingRoom。它们与HoloLens Emulation的模拟场景是一一对应的。


  • DefaultRoom:一间带电视,咖啡桌和两张沙发的小客厅。

  • Bedroom1:一间带书桌的小卧室。

  • Bedroom2:带大号床的卧室,梳妆台,床头柜和步入式衣柜。

  • GreatRoom:一个宽敞的大型客厅,客厅,餐桌和厨房。

  • LivingRoom:带壁炉,沙发,扶手椅和带花瓶的咖啡桌的起居室。


Gesture Hand

虚拟手掌,即设置模拟手势操作的虚拟。

  • Right Hand:右手

  • Left Hand:左手


手柄控制

在MR场景中需要有许多交互的体验,所以HoloLens可以使用手柄控制器来进行操作模拟器中的虚拟人物。



控制器相关键位的作用:

  • Left stick:左摇杆——控制虚拟人物前后左右移动。

  • Right stick:右摇杆——控制虚拟人物抬/低头,左右转动。

  • D-pad:方向键——控制虚拟人物上下移动;左右转头。

  • Left/Right trigger/A:左右扳机/A键——执行虚拟手掌的点击手势

  • Y:Y键——重置虚拟人物


以上这些操作基本能够涵盖MR大多数的交互操作。

远程模式(Remote to Device)


如果您有HoloLens硬件设备,Unity也提供了可以直接远程运行与调试的模式,来帮助开发者便利开发HoloLens应用。



模式有以下几个参数:

  • Remote Machine:HoloLens 的IPv4格式局域网地址

  • Enable Video/Audio:启用视/音频输入

  • Max Bitrate:最大比特率

  • Connection Status:连接状态



连接到设备有三步。


首先,您需要安装并运行远程模式播放器(Holographic Remoting Player),可以从Windows应用商店下载。在设备上运行该应用,您将进入等待状态并显示设备的IP地址。可以访问Microsoft Windows Dev Center(微软Windows设备中心)了解如何开启连接会话的远程播放器等相关信息。


其次,在远程设备(Remote Machine)属性栏中输入设备的IP地址。字段右侧的下拉菜单中可以选择最近使用过的地址。


最后,点击“Connect(连接)”按钮。连接状态会变为带连接消息的绿色指示灯。现在您可以点击编辑器中的播放按钮并远程运行设备。您可以暂停、检查对象和调试,就像在编辑中运行普通应用一样,区别之处在于视频、音频和设备的输入是通过网络在主机和远程设备之间进行传输的。远程模式对于验证性能来说并不奏效(因为所有繁重工作都是由主机处理的),但它可用于在开发过程中进行快速迭代。

已知限制


在使用Holographic Emulation时,也有一些限制。


模拟模式

  • 大多数手柄控制都支持,但推荐Xbox 360或 Xbox One。

  • 可以执行图像捕捉,但因为图像捕捉会使用本地相机(例如网络摄像头),无法使用 TryGetProjectionMatrix 或者 TryGetCameraToWorldMatrix 来获得矩阵。


远程模式

  • 不支持语音(PhraseRecognizer语音识别),而是获取编辑器所在主机的语音。

  • 主机PC端所有的音频将重定向到设备上(而不仅是来自应用的)。


交互开发


HoloLens有几种重要交互相关的开发内容,分别是Gaze凝视,Gesture手势,Voice Command语音控制,Spatial Mapping空间映射,Spatial Sound空间音效和World Coordinate坐标系统这几个方面。


为了帮助开发者更好地开发HoloLens应用,微软在GitHub上提供了HoloToolkit-Unity插件,下文会从Unity原生API和Microsoft HoloToolkit-Unity两方面介绍这些交互开发的实战技巧。

Gaze凝视

Gaze凝视是VR项目中最最常见的交互方式。

Unity API

Physics.Raycast( Camera.main.transform.position, Camera.main.transform.forward, // 这个就是凝视的方向 …)

如果了解Unity开发的话,原理其实很简单,就是从主摄像机的朝向视角发出一个射线,碰到游戏对象后再进行后续判断处理。

HoloToolkit API

GazeManager - 封装好的Gaze管理器,开发者可以很便利使用这个单例进行凝视的操作控制。


GazeStabilizer - 凝视功能的稳定器,用于稳定体验者的“目光”,其实就是解决头部抖动的问题。


BasicCursor - 一个圆环状的预制件,用于跟随体验者“目光”的光标。


开发中的注意事项

  • “凝视”跟踪的是用户头部的移动,而不是眼睛。

  • 可以使用“光标”或者其他视听的提示,帮助使用者进行交互。


Gaze的距离设计


从上图中可以看出来,HoloLens设计最佳凝视体验的距离是2米左右,而对象的大小是在5到10厘米左右。在大多数情况下,最小目标尺寸为1-1.5度应允许成功的用户操作,尽管3度的目标通常允许更高的速度。请注意,即使是3D元素,用户所针对的大小实际上也是2d区域 - 无论哪个投影面向它们都应该是可定位区域。

 使用“凝视”高亮目标对象的例子


Gesture手势

Gesture手势是MR设备特有的交互方式之一,通过摄像机捕捉体验者手势的动作,从而判定应该执行怎样的操作指令。

Unity API

UnityEngine.VR.WSA.Input - 在这个类中,有许多手势识别与操作的方法。但是仅在Windows 10有效。


GestureRecognizer - 用于识别用户手势的API。


GestureRecognizer仅执行您要求的一组手势之间的最小消歧。 例如,如果您只要点击,用户可以按住他们的手指按住它们,只要他们喜欢,并且当用户释放手指时,点击仍然会发生。 有关手势类型的更多详细信息,请参阅GestureSettings。


GestureRecognizer将仅在StartCapturingGestures被调用后才会收到事件。 StopCapturingGestures可以再次调用来停止事件。 这允许GestureRecognizer根据需要被激活和停用,例如当用户凝视移动并远离对象时。


InteractionManager - 提供从手,控制器和系统语音命令访问用户输入。


InteractionSource - 表示可以导致交互和手势的一个检测到的手,控制器或用户声音的实例。


HoloToolkit API

GesturesInput - 输入源自WSA API的手势信息,可以访问各种系统支持的手势。


InputManager - 一个预制件,用于管理HoloLens输入系统,目前支持的凝视和各种输入源,例如手和手势。还包括一个假的输入源,可以在编辑器中模拟手输入。 默认情况下,可以通过按住Shift(左手)或Space(右手),移动鼠标移动手并使用鼠标左键点按。


常用手势种类

Tap:空中点击(包括双击)

Hold:抓住对象

Manipulation:操纵对象,即在抓住对象之后,进行移动的控制

Navigation:导航操作,即HoloLens的一些面板是有轴向的滚动条,就是对这些滚动条进行操作。


手势功能的使用步骤

以Tap为例,使用Unity原生API,介绍从创建到最后解除的步骤:

  1. 创建:GestureRecognizer recognizer = new GestureRecognizer();

  2. 指定:recognizer.SetRecognizableGestures(GestureSettings.Tap);

  3. 绑定事件:recognizer.TappedEvent += MyTapEventHandler;

  4. 开始捕捉手势:recognizer.StartCapturingGestures();

  5. 停止捕捉手势:recognizer.StopCapturingGestures();

  6. 解绑事件:void OnDestroy() { recognizer.TappedEvent -= MyTapEventHandler; }


尤其注意,最后的解绑事件不能忘记,在OnDestroy中一定要加入Event的“-=”操作。


Voice Commands(语音控制)

语音控制是非常有意思的交互方式,从理论上它解放了双手,藉以微软自有的语音控制的方式,也帮助开发者有更多设计创意的可能性。

Unity API

UnityEngine.Windows.Speech - 在这个类中,有一些语音控制处理相关的API。但是仅在Windows 10有效。


KeywordRecognizer - 侦听语音输入,并尝试将发音短语与注册关键字列表相匹配。


GrammarRecognizer - 它是KeywordRecognizer的补充。 在许多情况下,开发人员会发现KeywordRecognizer满足他们所有的开发需求。 然而,在某些情况下,更复杂的语法将以XML文件的形式更好地表达。 语法识别器使用万维网联盟(W3C)语音识别语法规范(SRGS)1.0版中规定的可扩展标记语言(XML)元素和属性。 这些XML元素和属性表示定义由语音识别引擎识别的单词或短语(命令)的规则结构。有关此格式的信息,请参见http://www.w3.orgspeech-grammarspeech-grammar/或MSDN。


DictationRecognizer - 它用于听取语音输入,并尝试确定发音是什么。用户可以注册并听取假设和短语完成的事件。 Start()和Stop()方法分别启用和禁用听写识别。 使用识别器完成后,必须使用Dispose()方法进行处理,以释放其使用的资源。 如果垃圾收集之前没有释放,它将以额外的性能成本自动释放这些资源。


HoloToolkit API

KeywordManager - 允许您在Unity编辑器的检视视图中指定关键字和方法,而不是在代码中明确注册它们。


使用语音控制的步骤如下:

//引用准备

using UnityEngine.Windows.Speech;using System.Collections.Generic;using System.Linq; 

//新建与准备关键字字典

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

 //初始化识别器

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

//绑定“措辞”事件keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

//启用识别器

keywordRecognizer.Start();

//停止识别器

keywordRecognizer.Stop();

//解绑事件

void OnDestroy() { keywordRecognizer.OnPhraseRecognized -= KeywordRecognizer_OnPhraseRecognized;

}


注意事项

  • 所有的API要生效,必须要有“麦克风”。

  • 保持与互联网通畅的连接状态,因为除了“Select”,其他都需要Cortana语音助手来进行识别。

  • “措辞识别”与“听写”功能之间是“排他的”,必须停止一个才能开始另一个。


Spatial Mapping(空间映射)

空间映射是将现实世界对象映射到虚拟世界中的过程。 这是为您的Windows全息应用程序提供更好的现实世界交互的好方法。

Unity API

UnityEngine.VR.WSA - 其中有许多SpatialMapping和Surface相关的类,可以帮助开发者实现各种空间映射的需求。


SurfaceObserver - 它是空间映射底层API最重要的成员,提供了对设备对现实世界的理解的洞察力。SurfaceObserver描述世界中的一个立体对象,并报告哪些曲面已被添加,更新或删除。 然后应用程序可以异步地请求具有或不具有物理冲突数据的网格数据。 当请求被填满时,另一个回调通知应用程序数据已准备就绪。


SurfaceData - 另一个重要的组成部分是SurfaceData对象。 这包含构建和报告Surface的网格数据所需的所有信息。填充的SurfaceData在RequestMeshAsync调用中传递给系统。 当Mesh数据准备就绪时,在请求时提供的“data ready”回调中返回一个匹配的SurfaceData。 这允许应用程序精确地确定数据对应于哪个表面。


HoloToolkit API

SpatialMappingManager - 管理应用程序与所有空间映射数据源(文件,观察者,网络)之间的交互。


SpatialUnderstanding - 控制理解模块中使用的扫描过程的状态和流程,提供了可视化扫描过程的手段。


注意事项

  • 空间映射需要可感知的空间,需要比较封闭的场景,比如体积不是很大的房间。

  • 使用时需要做优化,比如遮挡剔除等。


Spatial Sound(空间音效)

Unity的音效系统本身就具备3D环境下处理空间音效的能力。

Unity设置

AudioSource组件设置 : 3D Sound Settings包含所需大部分控制参数。


AudioManager - 点击Unity编辑器菜单栏Edit→Project Settings→Audio,打开AudioManager窗口。


关键设置:系统采样率设为48000,采用Microsoft HRTF声场定位技术

HoloToolkit API

UAudioManager - 通过它,声音设计师可以设置播放行为的音频事件,并且通过单例API播放音频事件。

注意事项

空间音效在 MR/VR 沉浸式环境中非常重要。

World Coordinate(坐标系统)

所有3D图形应用程序都使用笛卡尔坐标系来推导出虚拟世界中物体的位置和方向。这样的坐标系建立了3个垂直轴,沿其定位物体:X,Y和Z轴。在混合现实中,您的应用程序将对虚拟和物理坐标系统都有所了解。Windows调用在物理世界中具有真实含义的坐标系统的空间坐标系。空间坐标系以米为单位表示其坐标值。这意味着在X,Y或Z轴分开放置2个单位的对象将在混合现实中呈现出彼此相距2米。这使您可以轻松地在现实世界范围内渲染对象和环境。

Unity API

WorldAnchor - 锚点组件是虚拟世界与现实世界互动的一种方式。 锚点是一个特殊的组件,可以覆盖同一GameObject上的Transform组件的位置和方向。 对于具有Anchor组件的GameObjects,系统会根据系统的理解,将其锁定在现实世界中。而World Anchor(世界锚点)组件代表物理世界的精确点与世界锚点的父GameObject之间的联系。 一旦添加,具有World Anchor组件的GameObject将保持锁定到现实世界中的位置。

HoloToolkit API

TapToPlace - 将此可扩展脚本添加到GameObject中非常简单,允许用户沿着空间映射网格点击并放置GameObject。TapToPlace还允许用户指定父GameObject与选定的GameObject一起移动。需要场景中的GazeManager,GestureManager和SpatialMappingManager。


WorldAnchorManager - 将世界锚点包装并简化一些繁琐的API内容。


注意事项

  • 建议组合内容使用单一锚点。

  • 较远距离对象的锚点坐标系尽量在 3 米以内。


结语


今天的内容非常丰富,详尽地为大家介绍了HoloLens设备的各项功能,以及如何从Unity中使用这些功能。点击[阅读原文]进入Unity官方中文社区(unitychina.cn),还可以查看更多Unity与HoloLens开发相关的学习资源。


更多Unity相关技术文章

Unity中可用于VR环境的空间化音效

Unity 5.6中的混合光照

Unity实验预览版支持为macOS开发VR及AR内容

基于Animation Instancing的大规模人群模拟

eaglEEye性能测试平台详解


点击“阅读原文”进入Unity官方中文社区

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存