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. android中实现view可以滑动的六种方法续篇(一)

    承接上一篇,如果你没有读过前四章方法,可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4985053.html 下面开始讲第五中方法. 五.利用Sc ...

  2. Spring配置文件外部化配置及.properties的通用方法

    摘要:本文深入探讨了配置化文件(即.properties)的普遍应用方式.包括了Spring.一般的.远程的三种使用方案. 关键词:.properties, Spring, Disconf, Java ...

  3. hiveql basic

    set hive.cli.print.current.db=true; set hive.mapred.mode=strict; set hive.mapred.mode=nonstrict; SHO ...

  4. Snowflake weakness and type2 fact table

    DimProduct DimSubcategory Dimcategory productpk subcategorypk categorypk sku subcategoryName categor ...

  5. [转]Ionic + AngularJS angular-translate 国际化本地化解决方案

    本文转自:http://www.cnblogs.com/maoyazhi/p/4332362.html 欢迎访问我们的网站,网站上有更多关于技术性的交流:http://www.ncloud.hk/技术 ...

  6. 使用selenium实现右键另存为保存文件

    1.需要借住autoit工具和Robot类,下载地址:https://www.autoitscript.com/site/autoit/downloads/ 2.autoit的使用不再详细讲解.如下图 ...

  7. js confirm()方法的使用方法实例

    今天学习了js 中confirm的使用方法,confirm() 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框. 如果用户点击确定按钮,则 confirm() 返回 true.如果点击取消按 ...

  8. FlashInspector 【Firefox浏览器插件,flash分析工具】

    Inspect flash(swf)'s DisplayObject with mouse. Overview the swf's DisplayObject list. Set the inspec ...

  9. maya获取邻接顶点的一个问题

    maya网格数据结构允许"非流形"的存在,于是,这种数据结构无法按顺序给出一个点的邻接顶点. 于是,MItMeshVertex::getConnectedVertices函数返回的 ...

  10. 利用concat进行数组复制

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...