Hololens开发手记——Unity之World Anchor空间锚

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

 

 

Adding a World Anchor 添加空间锚


 

 

命名空间: UnityEngine.VR.WSA

类型: WorldAnchor

 

Unity中添加空间锚的方式很简单,如下:

 

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

 

Removing a World Anchor 移除空间锚


 

如果你不再想将GameObject固定在特定位置,同时在场景中也不想移动它,,那么可以调用Destroy()方法来销毁WorldAnchor组件,如下:

 

Destroy(gameObject.GetComponent<WorldAnchor>());

 

如果你想要立刻在场景中移动对象,那么需要调用DestroyImmediate()来销毁空间锚组件,如下:

 

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

 

Moving a World Anchored GameObject 移动锚定的全息对象


 

当全息对象已附加空间锚组件后,它不能被移动。如果你需要一定全息对象的话,那么你必须这样做:

  1. 立刻销毁空间锚组件
  2. 移动全息对象
  3. 添加一个新的空间锚到全息对象上
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

 

Handling Locatability Changes 处理可定位能力的变化


 

在某个时间点,空间锚可能不能够在世界中被定位到。如果这种情况发生,Unity将不能更新锚定对象的位置。在应用运行时,这也肯能会发生变化。不能够及时处理可定位能力的变化,可能会导致对象不会出现在准确的位置上。

为了追踪可定位能力的变化,需要采取如下做法:

  1. 订阅OnTrackingChanged事件
  2. 处理此事件

 

订阅事件

代码如下:

 

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

 

处理OnTrackingChanged事件

代码如下:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
       // 根据定位状态简单的显示或者隐藏对象
    self.gameObject.SetActiveRecursively(located);
}

 

设定明确的初始状态

有时空间锚能够立刻被定位到。这时候,给对象添加空间锚后,空间锚组件的isLocated属性值将会被设为true,这是OnTrackingChanged事件将不会被触发。因此,在添加空间锚组件后,推荐立刻使用初始的isLocated状态去调用OnTrackingChanged事件,如下:

 

Anchor_OnTrackingChanged(anchor, anchor.isLocated);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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中移除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值