如何提高 ARKit 测量两个 SCNNode 之间距离的准确性?

Posted

技术标签:

【中文标题】如何提高 ARKit 测量两个 SCNNode 之间距离的准确性?【英文标题】:How to improve accuracy of ARKit for measuring distances between two SCNNodes? 【发布时间】:2019-01-30 07:52:47 【问题描述】:

有人知道如何改进 ARKit 中的测量。

我目前的 ARConfiguration 是:

    let configuration = ARWorldTrackingConfiguration()
    configuration.maximumNumberOfTrackedImages = 10
    configuration.environmentTexturing = .automatic

    configuration.planeDetection = [.horizontal , .vertical]
    configuration.isLightEstimationEnabled = true
    configuration.worldAlignment = .gravity

我尝试计算两个 SCNNode 之间的距离。有什么方法可以改善这种情况吗?我尝试计算 2m - 10m 之间的距离。有时偏差对我来说太高了(30 cm+)。

是否可以使用平面来提高精度?还是有其他想法?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

SCNNodes 在 Vectors 中有位置见documentation

根据两个场景节点的这两个属性,您可以用简单的物理方法计算它们之间的距离。例如,您可以计算 2D 中的距离和 3d 世界中的距离。可以用这两个扩展来做一个例子。

extension SCNVector3 
    static func distanceFrom(vector vector1: SCNVector3, toVector vector2: SCNVector3) -> Float 
        let x0 = vector1.x
        let x1 = vector2.x
        let y0 = vector1.y
        let y1 = vector2.y
        let z0 = vector1.z
        let z1 = vector2.z

        return sqrtf(powf(x1-x0, 2) + powf(y1-y0, 2) + powf(z1-z0, 2))
    

然后在你的主类中你可以像这样调用静态函数

let scnNode1 = SCNNode() //Your test node
let scnNode2 = SCNNode() //Your test node
let distance = SCNVector3.distanceFrom(vector: scnNode1.position, toVector: scnNode2.position)

【讨论】:

我已经有了计算距离的方法。问题是,准确度不够高 你亲手核对过数字,发现差别很大吗?您的问题的答案是,您必须使用 .position Vector3 属性。现在,如果你有很大的不同,那是因为你的数学。如果你想把数字发给我告诉你 计算是对的。我检查了它,其他人也检查了它。一个大问题是,当距离较高时,节点会移动。它们距离 ArKit 太远,无法将它们固定在所需位置。 如果距离太大,您必须计算地球的弧度才能获得准确的距离,但如果我们以公里为单位,就会发生这种情况。 远距离也有同样的问题。想知道您是否找到了解决方案。

以上是关于如何提高 ARKit 测量两个 SCNNode 之间距离的准确性?的主要内容,如果未能解决你的问题,请参考以下文章

在 ARKit 中检测对 SCNNode 不同位置的触摸

ARKIT:在一个SCNNode与另一个SCNNode之间画线时观察滞后

ARKit 如何在没有跟踪时暂停视频

如何将SKScene添加到SCNNode平面?

如何使用 ARKit 检测触摸并显示新的 SCNPlane?

未经许可将 SCNNode 向北旋转以进行位置跟踪