首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Unity ARKit插件中处理ARAnchor合并/替换

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

Stack Overflow用户
提问于 2018-12-17 20:52:34
回答 1查看 392关注 0票数 1

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

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

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

代码语言:javascript
复制
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]委托(以及相关的add/remove委托),但它似乎没有提供有关合并的信息。

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

EN

回答 1

Stack Overflow用户

发布于 2019-05-16 11:14:15

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

代码语言:javascript
复制
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 
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53815673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档