c# - 如何在 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,所以我想知道是否有更好的方法。
解决方案
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
推荐阅读
- java - 如何使用嵌套数组列表将 JLabel 项目发送到 Apache POI
- python - 如何正确创建 saved_model.pb?
- node.js - 在 mongodb 中加入两个集合
- javascript - 试图在 turfJS 中配置可配置属性的可配置属性?
- floating-point - clang/gcc 仅使用 -ffast-math 生成 fma;为什么?
- asp.net - 内容安全策略框架祖先在 IE 11 中不起作用
- amazon-web-services - AWS 应用程序负载均衡器公共 URL 不起作用
- typescript - 将装饰器应用于模块中的每个函数的函数类型
- c# - 会话过期时,Kendo 网格不会重定向到登录页面
- r - 如何使用 tidyverse 包来获取列中出现的唯一值的运行总数?