我尝试在Unity中运行一个ARKit会话(使用Unity ARKit Plugin),用户在会话开始时选择一个平面,然后我们围绕该平面构建一个世界。
显然,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]委托(以及相关的add/remove委托),但它似乎没有提供有关合并的信息。
最糟糕的情况是,如果我选择的锚点被移除,我可以寻找最相似的锚点,但这似乎很麻烦,所以我想知道是否有更好的方法。
发布于 2019-05-16 11:14:15
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
}https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@1.0/manual/index.html不再支持ARKit插件,建议使用AR基础: Unity
https://stackoverflow.com/questions/53815673
复制相似问题