Hololens2实现空间描点(本地化)

        空间锚提供了一种能够将物体保留在特定位置和旋转状态上的方法。这保证了全息对象的稳定性,同时提供了后续在真实世界中保持全息对象位置的能力。MRTK官方给的方法是基于Azure云来实现的,这个云目前个人无法注册,所以暂时只能本地化来实现,本地化其实就是单机版运行,但是其他Hololens设备无法共享这些位置信息,这里可以借助Hololens的门户系统把空间和锚点数据导出来共享给其他Hololens设备使用。

本地空间锚点实现

        这里使用的是 OpenXR ,所以用到的方法是基于 ARAnchorManager,如果是用的老版本Unity,使用的方法是基于WorldAnchor。

在Unity工程中添加空对象,然后添加ArSessionOrigin和ArAnchorManager,如下图:

 下面主要介绍ARAnchorManager相关代码

// 获取锚点存储器
XRAnchorStore _anchorStore = await _arAnchorManager.subsystem.LoadAnchorStoreAsync();

// 获取已经保存过的锚点名称
List<String> names = _anchorStore.PersistedAnchorNames;

// 通过名称加载锚点
// 加载描点之后会调用 _arAnchorManager.anchorsChanged 事件,在事件中可以获取到锚点的位置信息
var anchorId = _anchorStore.LoadAnchor(name);

// 事件demo案例
private void AnchorsChanged(ARAnchorsChangedEventArgs obj)
{
    if (obj.added.Count > 0)
    {
        // 描点对象信息
        var _currentAnchor = a.gameObject
    }
}

// 保存锚点
public void AddAnchor()
{
    // 根据位置、角度加载锚点预制体
    var _currentAnchor = AnchorContent(placingGameObject.transform.position, placingGameObject.transform.rotation, anchorPrefab);

    var anchor = _currentAnchor.GetComponent<ARAnchor>();
        
    // 如果名称存在,删除
    if (_anchorStore.PersistedAnchorNames.Contains(AnchorName))
    {
        _anchorStore.UnpersistAnchor(AnchorName);
    }

    // 保存锚点数据
    _anchorStore.TryPersistAnchor(anchor.trackableId, AnchorName);    
}

锚点本地化保存比较简单,下篇文章介绍如何把本地化数据通过门户系统接口,把空间锚点数据导出出来,给其他设备使用,达到空间位置共享的目的。

Hololens 2上使用Unity开发时,实现空间锚点的定位,使用Microsoft提供的Mixed Reality Toolkit (MRTK)。MRTK是一个开源的工具包,为Hololens和Windows Mixed Reality设备提供了许多基础功能和开发工具。其中包括空间锚点的定位。 具体实现步骤如下: 1. 在Unity中导入MRTK,并创建一个新的MRTK项目。 2. 添加空间锚点:在Unity场景中创建一个新的游戏对象,然后将SpatialAnchor组件添加到该对象上。 3. 将空间锚点与场景中的对象进行关联:在Unity场景中创建一个需要关联的对象,然后在该对象上添加SpatialObjectAnchor组件。在SpatialObjectAnchor组件中,选择要关联的空间锚点。 4. 编写代码实现空间锚点的定位:在Unity中编写C#脚本,在脚本中调用MRTK提供的SpatialAnchorManager类,实现空间锚点的定位。例如: ```csharp using Microsoft.MixedReality.Toolkit; using Microsoft.MixedReality.Toolkit.SpatialAwareness; public class SpatialAnchorManagerExample : MonoBehaviour { private IMixedRealitySpatialAwarenessSystem spatialAwarenessSystem; private GameObject spatialAnchorGameObject; private void Start() { spatialAwarenessSystem = CoreServices.GetSpatialAwarenessSystem(); spatialAwarenessSystem.Register(gameObject); } private void OnDestroy() { spatialAwarenessSystem?.Unregister(gameObject); } public void CreateSpatialAnchor() { // Create a new spatial anchor spatialAnchorGameObject = new GameObject("Spatial Anchor"); spatialAnchorGameObject.AddComponent<SpatialAnchor>(); // Add the spatial anchor to the spatial awareness system var anchorService = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealityAnchorService>(); anchorService.CreateAnchor(spatialAnchorGameObject); } public void DestroySpatialAnchor() { // Remove the spatial anchor from the spatial awareness system var anchorService = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealityAnchorService>(); anchorService.RemoveAnchor(spatialAnchorGameObject); // Destroy the spatial anchor game object Destroy(spatialAnchorGameObject); } } ``` 通过调用CreateAnchor方法,可以在Hololens 2中创建一个新的空间锚点。通过调用RemoveAnchor方法,可以将空间锚点从Hololens 2中移除。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值