Hololens官方教程精简版 - 02. Introduction with Device
来源:互联网 发布:外贸建站seo 编辑:程序博客网 时间:2024/09/21 09:02
前言
注意:本文已更新到5.5.1f1版本
个人认为,官方的Holograms 101教程是该系列最重要的一篇。这里面包含了几乎所有Hololens的特征:凝视、手势、声音输入、空间声音、空间映射。
准备工作
按《Hololens官方教程精简版 - 01. Getting started with Unity》 完成项目创建。
注意:以下包含5.5.0f3和5.5.1f1代码,练习时,注意对应自己的版本
Chapter 1 - “Holo” world
新建文件夹:”Assets/_Scenes/Holograms 101/”
在该文件夹下新建场景:”Holograms 101”
打开该场景,按上一篇的说明,设置好摄像机。
添加一个Cube到场景,并进行设置,如图:
测试运行!
(推荐使用Holographics Remoting Player进行开发过程测试,效率会高很多。)
Chapter 2 - Gaze(凝视)
目标
创建一个随“视线”移动的光标
实践
在Project面板中,找到”Assets/HoloToolkit/Input/Prefabs/InputManager.prefab”,拖动到Hierarchy根目录
同样,将”Assets/HoloToolkit/Input/Prefabs/Cursor/Cursor.prefab”,拖动到Hierarchy根目录
本节完成,测试运行!
说明
InputManager.prefab
输入管理器,用来管理视线、手势等输入源。
这个管理器还提供了在编辑器中模拟输入的功能:- Shift:左手
- Space:右手
- 鼠标移动:模拟手移动
- 鼠标左键:模拟手点击
- 鼠标右键:模拟视线移动
- WSAD/QE:摄像机移动
Cursor.prefab
工具包自带光标之一,主要实现凝视物体时,出现附着圆环,否则光标发亮。
其他几个自带光标如下:- BasicCursor.prefab:基础光标,凝视物体出现附着圆环,否则不显示。
- CursorWithFeedback.prefab:手势检测光标,当检测到手时,会变成一个手势图标。
- DefaultCursor.prefab:默认光标,模拟Hololens系统内置光标。
Chapter 3 - Gestures(手势识别)
目标
点击Cube,Cube坠落
实践
新建文件夹:”Assets/_Scenes/Holograms 101/Scripts/”
新建C#脚本:”Assets/_Scenes/Holograms 101/Scripts/Cube.cs”,内容如下:
(代码适用:5.5.0f3版本)
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; } }}
(代码适用:5.5.1f1版本)
using HoloToolkit.Unity.InputModule;using UnityEngine;public class Cube101 : MonoBehaviour, IInputClickHandler{ /// <summary> /// 点击事件(包含手势点击和Clicker设备的点击) /// </summary> public void OnInputClicked(InputClickedEventData eventData) { // 为Cube增加刚体,产生掉落效果 if (!this.GetComponent<Rigidbody>()) { var rigidbody = this.gameObject.AddComponent<Rigidbody>(); rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous; } }}
将脚本拖拽至Cube
本节完成,测试运行!
说明
- IInputClickHandler
点击事件处理接口,需要实现OnInputClicked(InputEventData eventData)
方法
在该方法中实现具体的逻辑。
HoloToolkit中还提供了更多的事件处理接口,如下:
- IFocusable 凝视聚焦事件,当视线进入或离开物体的触发
- IHoldHandle 处理Hold手势事件
- IInputHandler 处理点击过程中的按下和松开事件
- IInputClickHandler 处理点击事件
- IManipulationHandler 处理手势操纵事件,事件返回手势偏移量
- INavigationnHandler 处理手势导航事件,事件返回手势偏移量,值域[-1, 1]
- ISourceStateHandler 处理事件源的状态监测,比如:手势离开检测区域
- ISpeechHandler 处理语音命令(5.5.1f1新增)
Chapter 4 - Voice(声音)
目标
语音命令控制Cube坠落
实践
打开Player Settings…面板,在Publishing Settings>Capabilities中,勾选Microphone
修改文件:”Assets/_Scenes/Holograms 101/Scripts/Cube.cs”,如下:
(代码适用:5.5.0f3版本)
using HoloToolkit.Unity.InputModule;using UnityEngine;public class Cube : MonoBehaviour, IInputClickHandler{ // Cube原始位置 Vector3 originalPosition; void Start() { // 保存Cube原始位置 originalPosition = this.transform.localPosition; } /// <summary> /// 点击事件(包含手势点击和Clicker设备的点击) /// </summary> public void OnInputClicked(InputEventData eventData) { OnDrop(); } // 重置Cube位置 public void OnReset() { // 删除Cube的刚体,取消掉落效果 var rigidbody = this.GetComponent<Rigidbody>(); if (rigidbody != null) { DestroyImmediate(rigidbody); } // 重置Cube位置 this.transform.localPosition = originalPosition; } // 让Cube掉落 public void OnDrop() { // 为Cube增加刚体,产生掉落效果 if (!this.GetComponent<Rigidbody>()) { var rigidbody = this.gameObject.AddComponent<Rigidbody>(); rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous; } }}
(代码适用:5.5.1f1版本)
using HoloToolkit.Unity.InputModule;using UnityEngine;public class Cube101 : MonoBehaviour, IInputClickHandler{ // Cube原始位置 Vector3 originalPosition; void Start() { // 保存Cube原始位置 originalPosition = this.transform.localPosition; } /// <summary> /// 点击事件(包含手势点击和Clicker设备的点击) /// </summary> public void OnInputClicked(InputClickedEventData eventData) { // 为Cube增加刚体,产生掉落效果 if (!this.GetComponent<Rigidbody>()) { var rigidbody = this.gameObject.AddComponent<Rigidbody>(); rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous; } } // 重置Cube位置 public void OnReset() { // 删除Cube的刚体,取消掉落效果 var rigidbody = this.GetComponent<Rigidbody>(); if (rigidbody != null) { DestroyImmediate(rigidbody); } // 重置Cube位置 this.transform.localPosition = originalPosition; } // 让Cube掉落 public void OnDrop() { // 为Cube增加刚体,产生掉落效果 if (!this.GetComponent<Rigidbody>()) { var rigidbody = this.gameObject.AddComponent<Rigidbody>(); rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous; } }}
在Hierarchy中添加一个空的GameObject,命名为:”Controller”
将”Assets/HoloToolkit/Input/Scripts/Voice/KeywordManager.cs”拖拽至”Controller”
点击”Controller”,在Inspector面板中,按图进行设置:
其中:Keyword对应的语音命令,Response()面板中设置响应的对象及方法
本节完成,测试运行!
说明
- 为什么我发出语音命令,但是没有反应?
- 检查一下上面的步骤可有遗漏?
- 使用Holographics Remoting Player进行调试时,如果有外置麦克风,请试着对外置麦克风说话
- 请注意勾选Microphone功能
- 为什么要创建一个单独的”Controller”对象来放置语音命令脚本?
个人喜好,方便管理。将”KeywordManager.cs”放置在其他对象上也是可以的。
但需要提醒的是,尽可能不要放置到HoloToolkit内置的Prefab上。
由于目前HoloToolkit-Unity在Github上更新频率相当快!在项目中尽量保持组件的独立性,便于以后升级版本。
Chapter 5 - Spatial sound(空间声音)
目标
把Cube变成“音乐盒”,随着Cube的坠落,声音消失
实践
打开菜单:”Edit > Project Settings > Audio”,将Spatializer Plugin修改为:MS HRTF Spatializer,如图所示:
找到声音文件:”Assets/HoloToolkit/SpatialSound/Tests/Support/Audio/Vocals.wav”
将其拖拽到Cube上,点击Cube,按下图调整Audio Source:
本节完成,测试运行!
说明
Spatial Blend
调整声音的3D效果Doppler Level
多普勒级别越大,移动速度对声音波长的影响越大,移动中会导致“变声”Volume Rolloff
音量衰减模式
Chapter 6 - Spatial mapping(空间映射)
目标
扫描房间,将Cube放置在房间地面、墙体等地方
实践
找到文件:”Assets/HoloToolkit/SpatialMapping/Prefabs/SpatialMapping.prefab”
拖拽到Hierarchy 根级
空间映射完成,测试运行!
注意:第一次运行时,需要耐心等待一段时间
找到文件:”Assets/HoloToolkit/Utilities/Scripts/WorldAnchorManager.cs”
拖拽到Controller上
找到文件:”Assets/HoloToolkit/SpatialMapping/Scripts/TapToPlace.cs”
拖拽到Cube 上
单击Cube,在Inspector面板上,去掉Cube (Script)的勾选(否则在点击Cube时会出现异常)
放置物体完成,测试运行!
注意:需要等待空间映射效果出现后,才能放置Cube
说明:
SpatialMapping.prefab
内置空间映射组件WorldAnchorManager.cs
内置空间坐标管理器TapToPlace.cs
单击并放置物体到空间的脚本,内置的
小结
Holograms 101 是整个官方教程系列中最重要的一篇,要能达到闭着眼睛都能完成。
本篇未深入Hololens的各个功能,只是体验了一下。后续的文章会一个个的进行深入学习。
参考文档:
官方教程Holograms 101:https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/holograms_101
VR/AR/MR技术交流QQ群:594299228
- Hololens官方教程精简版 - 02. Introduction with Device
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版 - 01. Getting started with Unity
- Hololens官方教程精简版 -配置篇
- Hololens官方教程精简版 - 03. Gaze(凝视)
- Hololens官方教程精简版 - 04. Gesture(手势)
- Hololens官方教程精简版 - 05. Voice(语音)
- 【Hololens开发】Holograms 101: Introduction with Device(使用Hololens)
- GIT 第一次 clone 异常
- spring常用注解
- java.lang.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to
- BZOJ 3130 二分+网络流
- 马化腾:一秒变白痴,是我的第一个产品法则
- Hololens官方教程精简版 - 02. Introduction with Device
- 学习笔记:多重纹理
- eclipse maven工程生成war包
- R-FCN、SSD、YOLO2、faster-rcnn和labelImg
- RecycleView+SwipeToLoadLayout+Fresco的自定义刷新加载
- html中键盘事件----在路上(16)
- 原子操作的实现与原理
- url重写session
- list-group(Bootstrap)