对微软Hololens进行开发,要使用微软提供的工具HoloToolkit工具包。我使用的版本是HoloToolkit5.8.0,下载地址:
https://github.com/Microsoft/MixedRealityToolkitUnity/releases/tag/v1.5.8.0。
HoloToolkit有6个主要类别:Input,Sharing,SpatialMapping,SpatialSound,Utilities,Build。我将主要详细说明常用类别资源中组件的作用和使用方法。
(1)、Input资源提供了好多基本组件:HoloLensCamera,InputManager,Cursor(常用Cursor和CursorWithFeedback)。
InputManager.prefab:输入管理器,用来管理视线、手势等输入源。这个管理器还提供了在编辑器中模拟输入的功能:Shift:左手,Space:右手,鼠标移动:模拟手移动,鼠标左键:模拟手点击,鼠标右键:模拟视线移动,WSAD/QE:摄像机移动。
Cursor.prefab:工具包自带光标之一,主要实现凝视物体时,出现附着圆环,否则光标发亮。
其他几个自带光标如下: BasicCursor.prefab:基础光标,凝视物体出现附着圆环,否则不显示。
凝视物体和不凝视物体
CursorWithFeedback.prefab:手势检测光标,当检测到手时,会变成一个手势图标。 DefaultCursor.prefab:默认光标,模拟Hololens系统内置光标。
说了这么多组件,参考Hololens学院例子,在开始功能开发前,需要配置好常用组件,直接从Input资源中的Prefab中将相应组件拖拽到面板中,如图所示。
(2)、HoloToolKit通过接口的方式来实现事件处理功能。HoloToolkit中提供了很多的事件处理接口,如下:
IFocusable:凝视聚焦事件,当视线进入或离开物体的触发;IHoldHandle:处理Hold手势事件;IInputHandler:处理点击过程中的按下和松开事件;IInputClickHandler:处理点击事件;IManipulationHandler:处理手势操纵事件,事件返回手势偏移量;INavigationnHandler:处理手势导航事件,事件返回手势偏移量,值域[-1, 1];ISourceStateHandler :处理事件源的状态监测,比如:手势离开检测区域;ISpeechHandler:处理语音命令(5.5.1f1新增);
我们以IInputClickHandler为例给出以下代码:
using HoloToolkit.Unity.InputModule;
using UnityEngine;
public class Cube : MonoBehaviour, IInputClickHandler
{
/// <summary>
/// 点击事件(包含手势点击和Clicker设备的点击)
/// </summary>
public void OnInputClicked(InputEventData eventData)
{
// 为Cube增加刚体,产生掉落效果
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
}
(3)、Hololens主要交互操作有凝视交互、手势交互和语音交互。凝视和手势交互都是通过实现接口来完成功能开发,而语音交互通过使用HoloToolkit中的KeyWorldManager和ISpeechHandler接口一起来实现的。
其中:Recognizer Start有Auto Start和Manual Start,Keyword对应的语音命令,Response()面板中设置响应的对象及方法。
注意:如出现发出语音命令,但是没有反应?原因:检查一下上面的步骤可有遗漏,使用Holographics Remoting Player进行调试时,如果有外置麦克风,请试着对外置麦克风说话,请注意勾选Microphone功能。
(4)、Spatial Sound(空间声音)
在Unity中使用声音插件来实现空间声音。这个插件(audio spatalizer plugin)被打包到了Unity,只需要在设置菜单中Edit->Audio->Spatializer启用Microsoft HRTF拓展就好。
通过调整Audio Source组件的3个属性即可在Unity中使用空间声音。步骤如下:1、在面板中,选中一个附有Audio Source组件的对象;2、在检视面板中,修改Audio Source组件属性:选中Spatialize属性(调整声音的3D效果);设置Spatial Blend模式为3D;展开3D Sound Settings,并将Volume Rolloff(音量衰减模式)值为 Custom Rolloff;
(5)、空间映射(Spatial mapping)
找到SpatialMapping.prefab,拖拽到根面板。找到WorldAnchorManager.cs附加到GameObject上,再将TapToPlace.cs附加到GameObject上。
其中SpatialMapping.prefab为内置空间映射组件;
WorldAnchorManager.cs为内置空间坐标管理器;
TapToPlace.cs为单击并放置物体到空间的脚本。
(6)、共享全息影像(Sharing holograms)
为了实现在同一房间的多个人可以看到“同一个物体”,这就要需要将全息影像进行共享即将全息影像的空间位置等信息进行共享。要想实现这个效果,有以下几点需要注意:
1、需开启设备的Spatial Perception功能(在Player Setting面板的Publishing Settings->Capabilities中勾选);
2、需开启设备的网络功能;
3、暂时只能两台以上真机测试,无法在Unity中测试(即便是Remoting连接Hololens也不行);
4、设备在同一房间内;
共享全息影像主要通过以下技术方式来实现:
1、使用Socket协议传递数据;
2、理解世界坐标系及空间锚点的使用(WorldAnchor及WorldAnchorStore);
3、Sharing组件的使用(锚点的上传和下载);
可以参考微软学院的Holograms 240案例,下载地址:
https://docs.microsoft.com/zh-cn/windows/mixed-reality/holograms-240。
这一篇我主要说明了HoloToolkit开发包里常用的一些组件,这也是为了进一步功能开发做好了准备。在以后的学习中我会以实例的形式来分享如何利用HoloToolkit来进行开发。