如何在Unity ARKit插件中处理ARAnchor合并/替换

时间:2018-12-17 12:52:34

标签: c# objective-c unity3d augmented-reality arkit

我正在尝试在Unity(使用Unity ARKit Plugin)中运行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]委托(以及相关的添加/删除委托),但这似乎并未提供有关合并的信息。

最糟糕的情况是,如果我选择的锚钉被移除,我可以寻找最相似的锚钉,但这似乎很棘手,所以我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

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