是否可以像在 Vuforia 中那样在 ARKit 中跟踪对象?
Is it possible to track objects in ARKit like in Vuforia?
如果 Apple 的 ARKit 像 Vuforia 一样支持 3D 对象跟踪(甚至图像跟踪),我找不到任何信息。我不想在世界任何地方放置 3D 模型。相反,我想检测一个特定的 3D 对象并将 AR 对象放置在该对象的前面和顶部。
简单示例:我想在现实世界中跟踪一辆特定的玩具车,并在AR场景中在它上面加一个扰流板。
有人可以向我提供信息吗?
iOS 12 的更新: 在 "ARKit 2" 中(也就是 iOS 12 或更高版本上的 ARKit)...
图像检测已扩展到图像跟踪,因此最多四张图像不仅会被检测一次,它们会每帧更新 "live" 即使它们相对于世界移动space。因此,您可以将可识别的 2D 图像附加到您的玩具上,并让虚拟 AR 内容在屏幕上跟随玩具。
还有对象检测——在您的开发过程中,您可以使用一个 ARKit 应用程序来扫描真实世界的 3D 对象并生成一个 "reference object" 文件。然后,您可以将该文件传送到您的应用程序中,并使用它来识别用户环境中的该对象。这可能适合您的 "toy car" 情况...但请注意 3D 对象识别功能是检测,而不是跟踪:ARKit 不会跟随玩具车移动。
详情见the WWDC18 talk on ARKit 2。
iOS 11.3 的更新: 在 "ARKit 1.5"(也就是 iOS 11.3 或更高版本上的 ARKit)中,有一个新的图像检测功能在 ARKit 中。如果您有已知图像(如海报或扑克牌等),您可以将其包含在您的 Xcode 项目中 and/or 从其他地方加载它作为 ARReferenceImage
and put it in your session configuration's detectionImages
array. Then, when ARKit finds those images in the user environment, it gives you ARImageAnchor
对象告诉您在哪里他们是。
请注意,这与您从其他一些工具包中看到的 "marker-based AR" 不太一样 — ARKit 只会找到一次参考图像,它不会告诉您它是如何随时间移动的。所以这对 "triggering" AR 内容体验很有好处(比如那些你将 phone 指向商店里的星球大战海报然后一个角色走出的宣传片),但不适用于 AR 板虚拟角色附着在游戏部件上的游戏。
否则...
可以在每个捕获的 ARFrame 中访问相机图像,因此如果您有其他软件可以帮助完成此类任务,您可以将它们与 ARKit 结合使用。例如,Vision framework(也是 iOS 11 中的新功能)为此类任务提供了几个构建块——您可以检测条形码并找到它们的四个角,然后在手动识别感兴趣的区域后图像,跟踪它在帧之间的移动。
注意:这绝对是一个 hack,但它为 ARKit Unity 添加了持久图像跟踪。同样的想法也可以应用于本机库。
下载 ARKit 1.5 测试版 https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/branch/spring2018_update
在 ARSessionNative.mm 中,添加此代码块:
extern "C" void SessionRemoveAllAnchors(void* nativeSession) {
UnityARSession* session = (__bridge UnityARSession*)nativeSession;
for (ARAnchor* a in session->_session.currentFrame.anchors)
{
[session->_session removeAnchor:a];
return;
}
}
在UnityARSessionNativeInterface.cs中,在SessionRemoveUserAnchor下添加这段代码:
private static extern void SessionRemoveAllAnchors (IntPtr nativeSession);
在 RemoveUserAnchor 下:
public void RemoveAllAnchors() {
#if !UNITY_EDITOR
SessionRemoveAllAnchors(m_NativeARSession);
#endif
}
然后从更新或协程中调用它:
UnityARSessionNativeInterface.GetARSessionNativeInterface().RemoveAllAnchors ();
移除锚点后,可以再次识别图像。它不是很流畅,但绝对有效。
希望您觉得这有用!如果您需要进一步的帮助,请告诉我。
ARKit 2.0
for iOS 12 supports not only Camera Tracking
feature but also:
- 3D Object 追踪
- 面部追踪
- 图像跟踪
- 图像检测
- 3D Object 扫描
ARKit 3.0
for iOS 13 supports even more sophisticated features:
- 人物遮挡(RGBAZ实时合成)
- Body 跟踪 (a.k.a。动作捕捉)
- 多人脸追踪(最多3张脸)
- 同时前后摄像头跟踪
- 协作会议
如果 Apple 的 ARKit 像 Vuforia 一样支持 3D 对象跟踪(甚至图像跟踪),我找不到任何信息。我不想在世界任何地方放置 3D 模型。相反,我想检测一个特定的 3D 对象并将 AR 对象放置在该对象的前面和顶部。
简单示例:我想在现实世界中跟踪一辆特定的玩具车,并在AR场景中在它上面加一个扰流板。
有人可以向我提供信息吗?
iOS 12 的更新: 在 "ARKit 2" 中(也就是 iOS 12 或更高版本上的 ARKit)...
图像检测已扩展到图像跟踪,因此最多四张图像不仅会被检测一次,它们会每帧更新 "live" 即使它们相对于世界移动space。因此,您可以将可识别的 2D 图像附加到您的玩具上,并让虚拟 AR 内容在屏幕上跟随玩具。
还有对象检测——在您的开发过程中,您可以使用一个 ARKit 应用程序来扫描真实世界的 3D 对象并生成一个 "reference object" 文件。然后,您可以将该文件传送到您的应用程序中,并使用它来识别用户环境中的该对象。这可能适合您的 "toy car" 情况...但请注意 3D 对象识别功能是检测,而不是跟踪:ARKit 不会跟随玩具车移动。
详情见the WWDC18 talk on ARKit 2。
iOS 11.3 的更新: 在 "ARKit 1.5"(也就是 iOS 11.3 或更高版本上的 ARKit)中,有一个新的图像检测功能在 ARKit 中。如果您有已知图像(如海报或扑克牌等),您可以将其包含在您的 Xcode 项目中 and/or 从其他地方加载它作为 ARReferenceImage
and put it in your session configuration's detectionImages
array. Then, when ARKit finds those images in the user environment, it gives you ARImageAnchor
对象告诉您在哪里他们是。
请注意,这与您从其他一些工具包中看到的 "marker-based AR" 不太一样 — ARKit 只会找到一次参考图像,它不会告诉您它是如何随时间移动的。所以这对 "triggering" AR 内容体验很有好处(比如那些你将 phone 指向商店里的星球大战海报然后一个角色走出的宣传片),但不适用于 AR 板虚拟角色附着在游戏部件上的游戏。
否则...
可以在每个捕获的 ARFrame 中访问相机图像,因此如果您有其他软件可以帮助完成此类任务,您可以将它们与 ARKit 结合使用。例如,Vision framework(也是 iOS 11 中的新功能)为此类任务提供了几个构建块——您可以检测条形码并找到它们的四个角,然后在手动识别感兴趣的区域后图像,跟踪它在帧之间的移动。
注意:这绝对是一个 hack,但它为 ARKit Unity 添加了持久图像跟踪。同样的想法也可以应用于本机库。
下载 ARKit 1.5 测试版 https://bitbucket.org/Unity-Technologies/unity-arkit-plugin/branch/spring2018_update
在 ARSessionNative.mm 中,添加此代码块:
extern "C" void SessionRemoveAllAnchors(void* nativeSession) {
UnityARSession* session = (__bridge UnityARSession*)nativeSession;
for (ARAnchor* a in session->_session.currentFrame.anchors)
{
[session->_session removeAnchor:a];
return;
}
}
在UnityARSessionNativeInterface.cs中,在SessionRemoveUserAnchor下添加这段代码:
private static extern void SessionRemoveAllAnchors (IntPtr nativeSession);
在 RemoveUserAnchor 下:
public void RemoveAllAnchors() {
#if !UNITY_EDITOR
SessionRemoveAllAnchors(m_NativeARSession);
#endif
}
然后从更新或协程中调用它:
UnityARSessionNativeInterface.GetARSessionNativeInterface().RemoveAllAnchors ();
移除锚点后,可以再次识别图像。它不是很流畅,但绝对有效。
希望您觉得这有用!如果您需要进一步的帮助,请告诉我。
ARKit 2.0
for iOS 12 supports not onlyCamera Tracking
feature but also:
- 3D Object 追踪
- 面部追踪
- 图像跟踪
- 图像检测
- 3D Object 扫描
ARKit 3.0
for iOS 13 supports even more sophisticated features:
- 人物遮挡(RGBAZ实时合成)
- Body 跟踪 (a.k.a。动作捕捉)
- 多人脸追踪(最多3张脸)
- 同时前后摄像头跟踪
- 协作会议