Mixed Reality, MR, Uncategorized

HoloLens2 local anchors with OpenXR in Unity

Anchoring a scene
Sample Code
Jump straight to the Github repo here

I recently required the functionality of creating a single, persistent local spatial anchor on HoloLens2. The purpose is to provide stability and a persistent real-world location for a hierarchy of 3d model content. In this case there was no need for compatibility with other device types or for persistence across application instances. As a result Azure Spatial Anchors are not really needed and everything can happen locally on a HoloLens2 device without network access. In addition, for my use case only one anchor was needed as the content is relatively small-scale and all bounded within a 3m radius.

For other scenarios, such as cross-device sharing consider Azure Spatial Anchors and if you need to anchor larger holograms then look at the World Locking Tools.

We’ll use the Mixed Reality Toolkit Feature Tool to configure the project with the MRTK and the OpenXR Plugin

It is worth noting that since the last time I looked the APIs for this stuff have changed; I recall adding a script WorldAnchor to a gameObject to associate it with a spatial anchor and then using WorldAnchorStore to persist the anchor.

In order to access the correct APIs you would need to add the OpenXR plugin (I used the Mixed Reality Toolkit feature tool to do this).

The newer APIs we will use for this post are:

ARAnchorManager, ARAnchor AR Foundation namespace
XRAnchorStore is in the OpenXR namespace

Also, there is an official sample here upon which this post is based but is slightly simplified here as required for my simpler scenario.

First, I created an AnchorScript.cs and added it to my scene.

The ARAnchorManger and ARSessionOrigin and both in ARFoundation and will get added automatically when adding AnchorScript to a gameObject since they are required components. The AnchorScript itself references 3 items:

  • Placing Game Object – this has an ObjectManipulator script attached and will be used to position where we want the local anchor to be in 3d space
  • Anchor Prefab – This does not require a graphical element but I used a small coordinate system gizmo so we can identify the root of the anchors coordinate system
  • Actual Content – This is a reference to the content that we want to anchor


The transparent cube is used to position a local anchor in space so you can use far interactions or near interactions to position the cube and when the interaction ends a local anchor is created at that position and rotation.

The small axis mesh will show where there is currently a local anchor.

The content under the ActualContent parent gameObject will be re-parented under the anchored gameObject root. Subsequently introduced content would also be parented unfer that gameObject.

If you close the app and restart the anchor and the content will be positioned relative to where you left it.

Map Manager

The Map Manager part of the HoloLens developer portal provides a view onto the anchor store. You can use this to diagnose creation and deletion of anchors and save/load maps and anchors.

Tagged ,

5 thoughts on “HoloLens2 local anchors with OpenXR in Unity

  1. Is it possible multiple anchors.
    Lets say i have two cubes and wanted to move it irrespective to each other, in that case I required two anchors. Is it possible with this script which you have provided.
    Please suggest me the way to do for that.

    1. I think you would use an array to hold the ‘current anchors’ and process it accordingly. (I used a single anchor just to simplify the sample).

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.