5

问题情况:始终以舒适的方式在同一个地方(在桌子上)创建 AR 可视化。我们不希望客户像在无数 ARCore/ARKit 示例中那样自行放置对象。

我想知道是否有办法实现这些步骤:

  1. 检测桌子上的标记
  2. 使用标记的位置作为 AR-Visualization 的初始位置并继续进行 SLAM-Tracking

我知道 TangoSDK 的最新版本中包含类似标记检测 API 之类的东西。但这项技术仅限于少量设备(确切地说是两个......)。

最好的问候,并提前感谢任何想法

4

4 回答 4

2

到目前为止,这就是我为 ARKit 得到的。

@objc func tap(_ sender: UITapGestureRecognizer){
    let touchLocation = sender.location(in: sceneView)
    let hitTestResult = sceneView.hitTest(touchLocation, types: .featurePoint)

    if let hitResult = hitTestResult.first{
        if first == nil{
            first = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
        }else if second == nil{
            second = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
        }else{
            third = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)

            let x2 = first!.x
            let z2 = -first!.z
            let x1 = second!.x
            let z1 = -second!.z
            let z3 = -third!.z

            let m = (z1-z2)/(x1-x2)
            var a = atan(m)

            if (x1 < 0 && z1 < 0){
                a = a + (Float.pi*2)
            }else if(x1 > 0 && z1 < 0){
                a = a - (Float.pi*2)
            }

            sceneView.scene.rootNode.addChildNode(yourNode)
            let rotate = SCNAction.rotateBy(x: 0, y: CGFloat(a), z: 0, duration: 0.1)
            yourNode.runAction(rotate)
            yourNode.position = first!

            if z3 - z1 < 0{
                let rotate = SCNAction.rotateBy(x: 0, y: CGFloat.pi, z: 0, duration: 0.1)
                yourNode.runAction(rotate)
            }
        }
    }
}

理论是:
制作三个点 A,B,C 使得 AB 垂直于 AC。按 ABC 顺序点击点。
在 ARSceneView 的 x=0 中找到 AB 的角度,该角度为节点提供所需的旋转。
可以参考任何一个点来计算放置节点的位置。
从 C 中查找是否需要翻转节点。

我仍在处理一些需要满足的例外情况。

于 2017-12-15T15:30:39.190 回答
2

如果使用 Google Tango,您可以使用内置的区域描述文件 (ADF) 系统来实现这一点。该系统有一个保持屏幕,您被告知“四处走动”。在几秒钟内,您可以重新定位到设备之前所在的区域。(或从服务器等中提取信息。)

谷歌的 VPS(视觉定位服务)是一个类似的想法,(仍然是封闭的 Beta 版)应该来到 ARCore。据我了解,它将允许您使用来自所有扫描位置的全球共享地图的相机源来定位特定位置。我想,当它发布时,它会尝试填补AR Cloud类型系统的空白,为普通开发者解决这些问题。

请参阅https://developers.google.com/tango/overview/concepts#visual_positioning_service_overview

在学术界和其他 AR 产品、hololens 等中解决了仅使用空间和摄像头的预知识重新定位到空间的一般问题......不需要标记/标签。但是,我不确定还有哪些其他商业系统提供此功能。

于 2017-12-15T11:46:37.570 回答
2

我也对那个话题感兴趣。我认为 AR 的真正力量只有在与环境理解相结合时才能发挥出来。

我认为你有两个选择:

  1. 等待新的 Vuforia 7 发布,据说它将支持带有 ARCore 和 ARKit 的视觉标记。
  2. 参与 CoreML / 计算机视觉 - 理论上这是可能的,但我没有看到很多例子。我认为开始可能有点困难(例如构建和校准模型)。

但是苹果已经把它整理好了: https ://youtu.be/E2fd8igVQcU?t=2m58s

于 2017-12-14T13:51:37.847 回答
0

目前,ARKit 3.0 和 ARCore 1.12 都有所有必要的 API 工具来完成几乎所有基于标记的任务,以精确定位 3D 模型。

ARKit

ARKit 开箱即用,能够检测 3D 对象并将ARObjectAnchors放置在场景中,以及检测图像并使用ARImageAnchors进行准确定位。主ARWorldTrackingConfiguration()类包括实例属性.detectionImages.detectionObjects. 毫不夸张地说,ARKit 最初具有来自多个框架的不可或缺的内置功能:

除此之外,ARKit 3.0 与全新的RealityKit模块紧密集成,帮助实现多用户连接、ARAnchors列表和共享会话。

ARCore

虽然 ARCore 有一个名为Augmented Images的功能,但该框架没有内置机器学习算法,可以帮助我们检测真实环境的 3D 对象,但Google ML Kit框架确实有。因此,作为一名 Android 开发人员,您可以同时使用这两个框架在 AR 场景中的真实对象上精确地自动合成 3D 模型。

值得承认的是,ARKit 3.0 比 ARCore 1.12 拥有更强大和先进的工具包

于 2019-10-10T09:47:30.380 回答