Unity MRTK ——XRAnchor
不论是AR还是MR中,都有一个空间锚点的概念,表示系统经过一段时间追踪的现实世界中的重要点。每个锚点都有一个可调整的坐标系统,根据其他锚点和参考框架,以确保锚定虚拟投影在现实位置中。
通俗的来说,可以利用这个空间锚点系统来实现将虚拟物体的位置锚定在现实空间你指定的位置上,该锚点可以持久化存储,在下次使用时,虚拟物体仍会出现在锚点所在位置上。这个功能可以用来实现多人协同、特定位置展示虚拟物体等效果
目前MRTK本地锚点有新旧两套锚点系统,新锚点的识别度和稳定性略好于旧版锚点,但没有提供序列化和反序列化的方法,也就是无法自定义导出导入(Unity2020版本及以上+OpenXR),旧版锚点则提供序列化和反序列化的方法,可以将锚点数据导出保存在本地位置(仅能在Unity2020版本以下使用)这次先介绍新版锚点,旧版锚点会在后面如何开发MR多人协同时讲到。

首先新建一个工程,导入OpenXR和MR相关配置(工程及场景搭建可以参考《使用OpenXR开发MR》这篇文章),并创建一个C#脚本,先把锚点的相关功能完成
锚点初始化:
添加锚点:
删除锚点:
保存锚点:
加载锚点:
场景设置:
写完脚本后,回到场景,还需要在场景中添加一些物体组件
1、在Hierarchy面板中右键选择添加XR—AR Session 和 AR Session Origin到场景中,并在<AR Session Origin>物体上添加<AR Anchor Manager>组件

2、创建一个Sphere用来作为锚点的物体(可以是任意物体),并在上面添加抓取移动等脚本(MR SDK自带提供)

3、将之前写的脚本挂在一个新建的空物体上,将刚才创建的对象拖入到脚本变量中

4、为了方便测试,可以用MR提供的UI面板,或者自己创建UI按钮,将脚本中的几个锚点方法添加在按钮监听中

然后就可以打包测试了,将锚点物体也就是那个小球拖动到任意地方,然后触发添加锚点和保存锚点,如果锚点添加成功,那么物体会被锚定在那个现实位置上,只有移除后才可以移动,并且在退出程序,触发加载锚点后,物体又会回到之前保存的位置上。
这里就不截图展示了,感兴趣的可以自己去试试,锚点功能大致就在这里了,我个人测试的时候也遇到过一些坑,可以多去微软文档里和网上找找资料。

注意事项:
锚点可以存在多个,但每个锚点的名称必须是唯一的,否则会保存失败。如果在运行中多次重复删除添加锚点出现保存失败的问题,多半可能是锚点名称重复了。我目前测试中,最多一次性放置了八个锚点,具体上限没有测试过,但推荐还是减少锚点数量,如果需要多个物体定位,可以考虑将物体设为锚点子集,保存锚点位置后,再将物体和锚点的相对位置保存记录下来。
测试使用中,锚点的精准度根据环境识别度波动,在环境识别不够、环境复杂度过高或者光线不理想的场景下,锚点会出现丢失、抖动等情况,不太适用于室外或过大的空间,出现这种问题情况时,尝试多扫描周围环境、调整灯光、重启应用等方法来让锚点恢复。
以上就是个人在使用MR锚点时一些使用心得和遇到的一些问题,因为已经是去年使用测试的了,一些内容有错误和遗漏欢迎指正。
参考项目:https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples
参考文章:https://blog.csdn.net/ShanGuUncle/article/details/122670263
