Persistence 场景保持是HoloLens全息体验的一个关键特性,当用户离开原场景中时,原场景中全息对象会保持在特定位置,当用户回到原场景时,能够准确还原原场景的全息内容。WorldAnchorStore类是实现此特性的关键API,这保证了用户能够将任何全息对象贴到任何他们想要放置的位置。

How to persist holograms across sessions 如何在整个会话中保持全息对象


WorldAnchorStore能够允许你保持场景中空间锚的位置,为了能够真正保持全息对象,你需要单独使用特定的空间锚来追踪每一个对象。通常创建一个根GameObject并附上空间锚,同时对它的子GameObject也附上具有相对位置偏移的空间锚组件。

为了从先前场景载入全息对象:

  1. 获取WorldAnchorStore对象
  2. 载入空间锚关联的应用数据,从中获取空间锚ID
  3. 通过ID获取空间锚对象

下个场景之前,为了保存全息对象信息:

  1. 获取WorldAnchorStore对象
  2. 指定ID来保持对应空间锚对象
  3. 保持与空间锚关联的应用数据

Getting the WorldAnchorStore 获取WorldAnchorStore对象


命名空间: UnityEngine.WSA.VR.Persistence

类型: WorldAnchorStore

为了能够在后续使用WorldAnchorStore,我们需要先通过异步操作打开此对象,如下:

WorldAnchorStore.GetAsync(StoreLoaded);

private void StoreLoaded(WorldAnchorStore store)
{
this.store = store;
}

现在就可以使用WorldAnchorStore对象来保存场景信息了。

Saving a WorldAnchor 保存一个空间锚


注意:同一空间锚不能多次保存。每个空间锚只应该保存一次,如果需要更新空间锚信息,则需要先删除旧的空间锚信息,然后再保存新的空间锚信息。

private void SaveGame()
{
// 保存空间锚对应的全息对象数据
if (!this.savedRoot) // 仅仅保存根对象一次
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}

Loading a WorldAnchor 载入一个空间锚


载入空间锚数据很简单,如下:

private void LoadGame()
{
// Save data about holograms positioned by this world anchor
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// 我们没有成功保存空间锚和全息对象数据,需要重新替换我们的对象
}
}

Enumerating Existing Anchors 枚举已有的空间锚


我们可以通过枚举已保存的空间锚信息来查找之前保存的空间锚:

string[] ids = this.store.GetAllIds();
for (int index = ; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}

示例代码


using HoloToolkit.Unity;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.VR.WSA;
using UnityEngine.VR.WSA.Persistence; public class SceneManager : Singleton<SceneManager>
{ private WorldAnchorStore anchorStore;
private Dictionary<string, GameObject> SceneObjects = new Dictionary<string, GameObject>(); void Start()
{ WorldAnchorStore.GetAsync(WorldAnchorStoreLoaded);
} private void WorldAnchorStoreLoaded(WorldAnchorStore store)
{
this.anchorStore = store;
} //保存场景对象信息
public bool SaveSceneObject(string objectId, WorldAnchor anchor)
{
var result= this.anchorStore.Save(objectId, anchor);
if (result)
{
SceneObjects.Add(objectId, anchor.gameObject);
}
return result;
} //载入场景对象信息
public WorldAnchor LoadSceneObject(string objectId)
{
if (SceneObjects.ContainsKey(objectId))
{
var target = SceneObjects[objectId];
return this.anchorStore.Load(objectId, target);
}
return null; } //还原场景全部内容
public void RestoreAllSceneObjects()
{
foreach(var key in SceneObjects.Keys)
{
var target = SceneObjects[key];
this.anchorStore.Load(key, target);
}
} }

HoloLens开发手记 - Unity之Persistence 场景保持的更多相关文章

  1. HoloLens开发手记 - Unity之场景共享 Shared holographic experiences in Unity

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

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

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

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

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

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

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

  5. HoloLens开发手记 - Unity之Tracking loss

    当HoloLens设备不能识别到自己在世界中的位置时,应用就会发生tracking loss.默认情况下,Unity会暂停Update更新循环并显示一张闪屏图片给用户.当设备重新能追踪到位置时,闪屏图 ...

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

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

  7. HoloLens开发手记 - Unity之Gaze凝视射线

    凝视是HoloLens首要输入方式,形式功能类似于桌面系统的光标,用于选择操作全息对象.然而在Unity中并没有明确的Gaze API或者组件. 实现Gaze Implementing Gaze 概念 ...

  8. HoloLens开发手记 - Unity之语音输入

    对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中.HoloLens上语音输入有三种形式,分别是: 语音命令 Voice Command 听写 Diction 语法识别 Gr ...

  9. HoloLens开发手记 - Unity之World Anchor空间锚

    World Anchor空间锚提供了一种能够将物体保留在特定位置和旋转状态上的方法.这保证了全息对象的稳定性,同时提供了后续在真实世界中保持全息对象位置的能力.简单地说,你可以为全息物体来添加空间锚点 ...

随机推荐

  1. 读书笔记——Windows环境下32位汇编语言程序设计(5)模态对话框

    资源可以用VC之类的生成,然后拷贝出来. 例如:每一个MFC工程都有一个resource.h,没有做任何修改时,这个resource.h文件是原来自带的.当对资源进行过修改添加之类的时,新添加的资源的 ...

  2. 烂泥:KVM与kickstart集成

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. KVM与kickstart集成在这里我要说明下,因为在前面有关CentOS无人值守安装的文章中,我提到过如果要使用网卡PXE功能的话,内网中必须有DHC ...

  3. poj 3237 Tree [LCA] (树链剖分)

    poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...

  4. NOIP2008普及组传球游戏(动态规划)——yhx

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...

  5. Linux下的C之2048

    #include <stdio.h> #include <stdlib.h> #include <curses.h> #include <time.h> ...

  6. 基于go-ceph创建CEPH块设备及快照

    一.代码执行前准备 1.系统中安装了CEPH集群 2.GOPATH目录下存在src/github.com/noahdesu/go-ceph代码库 3.在ubuntu 14.04下还需apt-get l ...

  7. 如何用dos命令运行testng

    写好的自动化程序怎么让它运行呢,总不能每次都启动eclipse吧,下面就先介绍一种用dos命令运行testNG的方法. 1.把项目打成jar吧,我用的是Fat jar工具. 2.在电脑的某个盘建一个文 ...

  8. 读《深入理解Java虚拟机》有感——第一部分:Class文件的结构

    1.产生 源码(.java文件)——>编译器(如:javac)——>字节码(.class文件)——>虚拟机(如:HotSpot)执行 2.Class文件  1)构成:         ...

  9. [转载]ExtJs4 笔记(4) Ext.XTemplate 模板

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  10. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...