当前位置:   article > 正文

HoloLens之MixedReality250学习_mixedrealityplayspace中room和world的区别

mixedrealityplayspace中room和world的区别

Overview 概述

Steps

  1. Open Unity
    • 打开BuildSetting ,切换Universal Windows Platform
    • PlaySetting—> Inspector XR Settings 选中Virtual Reality Supported,并且需要VirtualReality SDK;
  2. Create a Scene
    • 将场景中的主摄像机删除
    • HoloTookit > Input > Prefabs中的MixedRealityCameraParent拖入到层次结构视图中;
  3. Add Hologrames to the scene
    • 将AppPrefabs文件夹中的Skybox拖拽到场景视图中;
    • 将AppPrefabs文件夹中的Managers拖拽到层次结构视图中;
    • 将AppPrefabs文件夹中的Island拖拽到层次结构视图中;
  4. Save And Build
    • 保存场景
  5. Export To Visual Studio;
  6. Build Form Visual Studio;
    • Release , X86 , LocalMachine;
    • Debug > Start Without Debugging or Control+F5

Digging into the code

  1. Assets\HoloToolkit\Input\Scripts\Utilities,打开MixedRealityCameraManager.cs;

概述:这个脚本是可以根据设备调整质量级别和背景设置,其中HolographicSetting.IsDisplayOpaque是检测设备是HoloLens(IsDisplayOpaque的值返回false)还是immersive headset(IsDisplayOpaque值返回true)

Enjoy your progress

现在只是出现在全息图像,但是还没有交互在里面,接下来需要2台机子都出现相同的画面,并且immersive headsetrymt设备也将会显示蓝天和云彩;

Interaction 交互

Objectives

展示如何处理在Windows Mixed Reality的应用程序的输入;

What we will build

注意:在HoloLens中点击事件使用 air tap,而在immersive headsets,在XBOX控制中需要使用A按钮,更多的可查看https://docs.microsoft.com/zh-cn/windows/mixed-reality/gestures;

Steps

  1. Add Input manager
    • HoloToolkit > Input > Prefabs 将InputManager拖拽到层次结构视图中的Managers作为他的子级;
    • HoloToolkit > Input > Prefabs > Cursor 拖拽Cursor到层次结构视图中;
  2. Add Spatial Mapping
    • HoloToolkit > SpatialMappint > Prefabs 将SpatialMapping到层次结构视图中;
  3. Add Virtual Playspace 添加虚拟空间
    • 在层次结构视图中选中MixedRealityCameraParent选中Boundary;
    • 然后启用Boundary
    • 在AppPrefabs文件中将VRRoom手提到层次结构视图中;
  4. Add WorldAnchorManager ;添加空间锚点管理
    • 在层次结构视图中,选中Manager;
    • 添加组件WorldAnchorManager;
  5. Add TapToPlace to The Island;添加TapToPlace
    • 在层次结构视图中,展开Island;
    • 选中MixedRealityLand,添加加TapToPlace
    • 在TapToPlace的属性PlaceParentOnTap选中;
    • 设置PlacementOffset为(0,0.1,0);

Digging into the code

Script1 - GamepadInput.cs

在 Assets \ HoloTookit \ Input \ Scripts \ InputSources,在它同一目录中还有一个InteractionSourceInputSource.cs;
这2个脚本都有同一个基类,BaseInputSource;
BaseInputSource引用InputManager,用来触发事件,那么InputClicked事件是非常重要的,
这个脚本在使用TapToPlace.cs中显的非常重要了;
比如在GamePadInput,我们要轮询要按下的控制器上的按钮A,就会引发InputClicked事件了;在InteractionSourceInputSource中,就会引发InputClicked事件来响应TappedEvent;

Script2 - TapToPlace.cs

在Assets\HoloTookit\SpatialMapping\Scripts,TapToPlace.cs;
在开发者想要创建一个全息应用的时候首先就会用手势输入的方式来移动全息图;
首先,TapToPlace继承了IInputClickHandler,IInputClickHandler会处理由GamePadInput.cs或者InteractionSourceInputSource.cs引发的InputClicked事件;
OnInputClicked在BaseInputSource检测到碰撞体与射线相交的点并且TapToPlace牌焦点的时候调用;并且在HoloLens或者控制器上的A按钮按下将触发事件;
别外在Update中会执代码查看表面,以便于可以将游戏对象放置在表面上,但是immersive headsetrymt设备没有这个概念;那么就表示桌面的对象已用SpatialMapping物理层标记,当Update的的射线与虚拟桌面碰撞就可以获得一个位置了;

Sharing

Objectives目标

确保网络正确配置,详细说明设备之间共享空间锚点的方式;

Build

多人游戏项目,添加用户界面和逻辑来主持和加入,HoloLens用户会在会议中看到对方头上有云,而immersive headset在靠近锚的地方有云。 HoloLens的用户会在同一个地方看到岛上的全息图,但是immersive headset的用户不会,但是会与HoloLens中所见的非常相似,可以鸟瞰岛屿;

Steps

  1. 在层次结构视图中将Island和VRRoom删除;
  2. 在AppPrefabs文件文件夹中添加Usland到层次结构视图中;
  3. 然后将下面的预制体从AppPrefabs文件夹中拖拽到层次结构视图中;
    • UNETSharingStage
    • UNetAnchorRoot
    • UIContainer
    • DebugPanelButton

digging into the code

在Assets\ AppPrefabs\ Support\ SharingWithUnet\Scripts,UnetAnchorManager.cs
这个脚本可以使一个HoloLens和另一个HoloLens共享跟踪信息,那个当2个或以上的设备共同协作的话,这种混合现实就会更加具体了;
注意:
在Start函数中,需要检查一下IsDisplayOpaque这个属性,假设锚点已经建立,immersive headset没有公开导入或者导出锚点。如果在HoloLens上运行,这个脚本就是实现设备之间的共享锚点了,在启动会话的设备将会创建用于导出的锚点,在加入会话的设备将会启动会话的设备请求锚点;

输出

当用户创建会话的时候,NetworkDiscoveryWithAnchors将调用UNERAnchorManagers中的CreateAnchor方法;

CreateAnchor流程
  1. 先需要清除一下数据,比如清除以前收集到的锚点数据;
  2. 然后需要检查是否有加载的缓存锚点;锚点数据通常在5到20MB之间,那么重复使用缓存的锚点可以节省通过网络传输的数据量了;而且即使我们正在重新使用锚点,也需要准备好锚点数据,以防止新客户端加入的时候没有锚点;
获取锚点数据
  1. WorldAnchorTransferBatch类公开了准备的锚点数据用于发送到其他设备和应用程序的功能以及导入的锚点数据的功能;
  2. 如果处于导出路径,那么需要将锚点添加加WorldAnchorTransferBatch并调用ExportAsync函数,然后ExportAsync将调用Writebuffer这个回调函数;
  3. 在WriteBuffer中,我们将大块数据添加到我们保留的用于导出的列表;
  4. 在ExportComplete中,我们会将列表转换为数组;
  5. AnchorName变量也被设置,这将会触发其他设备在没有它的时候请求锚点;

如果在锚点不会导出或者创建的数据太少,将会再次尝试。就会再次调用CreateAnchor;
导出最终会调用UNetAnchorManager的AnchorFoundRemotely函数,当另一个设备找到锚点时,该设备会告诉主机,主机将使用该锚点作为“良好锚点”并作可以被缓存的信号;

输入
  1. HoloLens加入会话时,需要导入锚点,在UNETAnchorManager的更新函数中,AnchorName会被轮询;
  2. 当锚点名称更改时,导入过程开始;
  3. 首先,会尝试本地锚定存储中加载具有指定名称的锚点;
  4. 如果已经存在此锚点,就可以不下载数据的情况使用它;
  5. 如果没有,就需要调用WaitForAnchor来启动调用;

下载完成后--------------

  1. 调用NetworkTransmitter_dataReadyEvent,通知更新循环与下载的数据一起调用ImportAsync;
  2. 导入完成后,ImportAsync将调用ImportComplete;
  3. 如果导入成功,这个锚点将会保存在本地玩家存储中;

PlayerController.cs实际上会调用AnchorFoundRemotely让主机知道已建立好锚点;

Immersion and teleporting 沉浸和传送

Objectives

为每种类型的混合现实设备提供体验;

what we will Build

immersive headset用户渲染在岛上,HoloLens用户鸟瞰岛上景色,每种设备类型的用户都可以看到其他用户出现在世界中的情况;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48879
推荐阅读
相关标签
  

闽ICP备14008679号