首页 > 解决方案 > 如何在 Unity ARKit 插件中处理 ARAnchor 合并/替换

问题描述

我正在尝试在 Unity 中运行 ARKit 会话(使用Unity ARKit 插件),用户在会话开始时选择一个平面,然后我们围绕该平面构建一个世界。

显然,ARKit 对平面的估计随着时间的推移而更新,应用程序通过注册来处理它UnityARSessionNativeInterface.ARAnchorUpdatedEvent并相应地操纵游戏世界;但是,当一架飞机合并到另一架飞机时,我正在努力寻找一种方法来捕获它,以便我们可以使用新飞机进行更新。

在 ARCore中,当一个平面合并到另一个平面时,我们提供了“subsumedBy ”字段。然后我们可以通过注册一个事件来使用它来触发飞机的改变:

public static Action<BoundedPlane,BoundedPlane> planeReplaced;

// ...

public override void Update()
{
    Session.GetTrackables<DetectedPlane>(m_DetectedPlaneBuffer, TrackableQueryFilter.All);
    foreach (var detectedPlane in m_DetectedPlaneBuffer)
    {
        // ...
        if (detectedPlane.SubsumedBy != null)
        {
            OnPlaneReplaced(boundedPlane, detectedPlane.SubsumedBy);
        }
        // ...
    }
}

我假设 Unity 插件不支持这种开箱即用的行为,因此开始查看 Objective-C 本机会话实现以获取线索。我能看到的最接近的是[session:didUpdateAnchors][3]委托(以及相关的添加/删除委托),但这似乎没有提供有关合并的信息。

最坏的情况是,如果我选择的锚被删除,我可以寻找最相似的锚,但这似乎很hacky,所以我想知道是否有更好的方法。

标签: c#objective-cunity3daugmented-realityarkit

解决方案


ARKit 插件有一个已移除的锚点事件。将其与最近添加的锚点结合使用,以找到与已移除锚点最近的锚点:

void Start () {
    UnityARSessionNativeInterface.ARAnchorAddedEvent += ARAnchorAdded;
    UnityARSessionNativeInterface.ARAnchorRemovedEvent += ARAnchorRemoved;
}
void ARAnchorAdded(ARPlaneAnchor anchorData)
{
   //store anchorData in an array, you know the latest anchor is the newest.
}
void ARAnchorRemoved(ARPlaneAnchor anchorData)
{
   //find the closest anchor,  start at the bottom if you are looking for newest first
   //remove anchorData from the array 
}

Unity 不再支持 ARKit 插件,推荐使用 AR Foundation:https ://docs.unity3d.com/Packages/com.unity.xr.arfoundation@1.0/manual/index.html


推荐阅读