佩戴HoloLens的多个用户可以使用场景共享特性来获取集合视野,并可以与固定在空间中某个位置的同一全息对象进行交互操作。这一切是通过空间锚共享(Anchor Sharing)来实现的。

为了使用共享服务,在AppxManifest文件中必须要启用SpatialPerception能力。

Anchor Sharing 空间锚共享


在HoloLens扫描空间环境后,用户可以通过手动或者编程来选择建立一些空间锚。空间锚对象的信息的可以被序列化并传递给其他HoloLens设备,每一个设备都可以反序列化这些信息,并可以在空间中定位到此空间锚的位置。为了确保空间锚分享能起作用,每个设备都需要扫描周边足够的空间,使得空间锚代表的点能在空间中被正确识别。

Setting the SpatialPreception capability 启用能力

上一篇空间映射的文章里提过,这里我就不重复叙述了,想起请看:http://www.cnblogs.com/mantgh/p/5626796.html

Setup 初始化

下面的示例代码会在开始共享空间锚之前进行一些初始化操作:

public GameObject rootGameObject;
private UnityEngine.VR.WSA.WorldAnchor gameRootAnchor; void Start ()
{
gameRootAnchor = rootGameObject.GetComponent<UnityEngine.VR.WSA.WorldAnchor>(); if (gameRootAnchor == null)
{
gameRootAnchor = rootGameObject.AddComponent<UnityEngine.VR.WSA.WorldAnchor>();
}
}

Exporting 导出

导出分享一个空间锚的操作步骤如下:

  1. 创建一个 WorldAnchorTransferBatch 对象
  2. 添加空间锚对象用以传输
  3. 开始导出数据
  4. 当数据可用时处理 OnExportDataAvailable事件方法
  5. 处理导出完成事件 OnExportComplete
WorldAnchorTransferBatch对象会将空间锚数据导出为bytes数据:
private void ExportGameRootAnchor()
{
WorldAnchorTransferBatch transferBatch = new WorldAnchorTransferBatch();
transferBatch.AddWorldAnchor("gameRoot", this.gameRootAnchor);
WorldAnchorTransferBatch.ExportAsync(transferBatch, OnExportDataAvailable, OnExportComplete);
}

当导出的数据可用时,使用任意方法将数据发往另一台设备:

private void OnExportDataAvailable(byte[] data)
{
TransferDataToClient(data);
}

一旦数据导出完成,如果我们传输或者序列化数据失败,需要告诉其他设备放弃此段错误的数据。如果序列化成功,需要告诉其他设备可以使用导入使用此数据:

private void OnExportComplete(SerializationCompletionReason completionReason)
{
if (completionReason != SerializationCompletionReason.Succeeded)
{
SendExportFailedToClient();
}
else
{
SendExportSucceededToClient();
}
}

Importing 导入数据

设备在接收到其他来源的数据后我们同样可以使用WorldAnchorTransferBatch对象将我们的全息对象放置到数据代表的物理位置上。注意:导入有时会失败,需要重试:

//这个数组需要通过网络来从其他来源更新数据
network from TransferDataToClient
private byte[] importedData;
private int retryCount = ; private void ImportRootGameObject()
{
WorldAnchorTransferBatch.ImportAsync(importedData, OnImportComplete);
} private void OnImportComplete(SerializationCompletionReason completionReason, WorldAnchorTransferBatch deserializedTransferBatch)
{
if (completionReason != SerializationCompletionReason.Succeeded)
{
Debug.Log("Failed to import: " + completionReason.ToString());
if (retryCount > )
{
retryCount--;
WorldAnchorTransferBatch.ImportAsync(importedData, OnImportComplete);
}
return;
} this.gameRootAnchor = deserializedTransferBatch.LockObject("gameRoot", this.rootGameObject);
}

虽然可以通过导入远程数据来使全息对象固定在与其他用户相同的位置上,但是全息对象在Unity坐标系中位置可能与其他人不同。

示例代码:HoloToolkit Sharing


HoloToolkit项目简单封装了场景共享特性,大家可以直接使用Sharing目录下的prefab来集成此特性。

项目主页: https://github.com/Microsoft/HoloToolkit-Unity/tree/master/Assets/HoloToolkit/Sharing

HoloLens开发手记 - Unity之场景共享 Shared holographic experiences in Unity的更多相关文章

  1. HoloLens开发手记 - Unity development overview 使用Unity开发概述

    Unity Technical Preview for HoloLens最新发行版为:Beta 24,发布于 09/07/2016 开始使用Unity开发HoloLens应用之前,确保你已经安装好了必 ...

  2. HoloLens开发手记 - HoloLens真机上手简评

    千呼万唤始出来,终于今天拿到了HoloLens真机. 使用体验 使用自带的应用录制了一段使用视频,如下 设备概览 包装盒 本体 试戴 实际效果 GalaxyExplorer试玩 全息图像贴到现实场景表 ...

  3. HoloLens开发手记 - Unity之Spatial mapping 空间映射

    本文主要讨论如何在Unity项目中集成空间映射功能.Unity内置了对空间映射功能的支持,通过以下两种方式提供给开发者: HoloToolkit项目中你可以找到空间映射组件,这可以让你便捷快速地开始使 ...

  4. HoloLens开发手记 - Unity之摄像头篇

    当你穿戴好HoloLens后,你就会处在全息应用世界的中心.当你的项目开启了"Virtual Reality Support"选项并选中了"Windows Hologra ...

  5. HoloLens开发手记 - Unity之Recommended settings 推荐设置

    Unity提供了大量的设置选项来满足全平台的配置,对于HoloLens,Unity可以通过切换一些特定的设置来启用HoloLens特定的行为. Holographic splash screen 闪屏 ...

  6. HoloLens开发手记 - Unity之Spatial Sounds 空间声音

    本文主要讲述如何在项目中使用空间声音特性.我们主要讲述必须的插件组件和Unity声音组件和属性的设置来确保空间声音的实现. Enabling Spatial Sound in Unity 在Unity ...

  7. HoloLens开发手记- SpectatorView for iOS编译指南

    微软前两天发布了HoloLens 2,给MR开发带来了新的希望,全面的性能和显示效果提升,让人期待. 去年推出的预览版的全新SpectatorView for iOS解决方案,这允许我们直接使用带AR ...

  8. HoloLens开发手记 - 开始使用Vuforia Getting started with Vuforia

    Vuforia在6.1版本的Unity SDK里实现了对HoloLens的支持. 查看 Developing for Windows 10 in Unity 这篇文章来了解如何配置Unity和Visu ...

  9. HoloLens开发手记 - 使用HoloLens模拟器 Using HoloLens emulator

    首先下载HoloLens模拟器 HoloLens模拟器运行在没有真机的情况下在你的PC上测试应用,属于HoloLens开发工具系列.模拟器使用了Hyper-V虚拟机.通常通过传感器获取的人体和环境输入 ...

随机推荐

  1. nginx 与 lua 开发环境搭建

    首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.htm ...

  2. PHP模拟发送POST请求之二、用PHP和JS处理URL信息

    明白了HTTP请求的头信息后,我们还需要对请求地址有所了解.再者,HTTP GET请求是靠URL实现的,所以了解URL的构造,处理URL的重要性不言而喻. 在PHP中我们用parse_url()函数来 ...

  3. cookie的读入和读出

    写入cookie中 在mvc的控制器中 HttpCookie GetUserID = new HttpCookie("uID", 要保存的值); GetUserID.Expires ...

  4. JSP过滤器Filter配置过滤类型汇总

    一.配置方法1 映射过滤应用程序中所有资源<filter>    <filter-name>loggerfilter</filter-name>    <fi ...

  5. iOS -数据库网络之xml解析

    XML文件有2种解析方式 1.基于文档(document) 2.基于事件(sax)   1.IOS中XML文件获取   首先要将XML导入工程中 在ViewController的按钮事件中,代码如下: ...

  6. poj 3159 Candies 差分约束

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 22177   Accepted: 5936 Descrip ...

  7. css常见问题

    CSS: 1.垂直居中布局 (1)已知宽高 (2)未知宽高 https://segmentfault.com/q/1010000004073623 2.文字退格 text-indent: 4em; 3 ...

  8. zookeeper中Watcher和Notifications

    问题导读:1.zookeeper观察者什么时候调用?2.传统远程轮询服务存在什么问题?3.zk中回调服务的机制是什么?4.zk中watcher为什么不永久注册?5.什么是znode? 在阅读之前首先明 ...

  9. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

    BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1655  Solved: 798[Submit][S ...

  10. UVALive 6181

    模拟题,注意细节.. #include <iostream> #include<stdio.h> #include<math.h> #include<stri ...