【问题标题】:IOS ARKit Swift how can I get distance between me and a SCNNode when I moveIOS ARKit Swift当我移动时如何获得我和SCNNode之间的距离
【发布时间】:2018-07-18 20:01:37
【问题描述】:

我在使用 ARkit 时遇到问题,我使用 ARWorldTrackingConfiguration,当我有一个距离我一米的 SCNNode 时,当我使用 Iphone X 并移动到 SCNNode 时,我的相机 SCNNode 的 Z 位置会更新,我知道我在更靠近节点,但对于其他 Iphone (Iphone 8),我没有得到 Z 位置的更新。

即使使用 GPS,即使使用 kCLLocationAccuracyBestForNavigation,我也没有准确度。

我怎么知道我离 SCNNode 更近了??谢谢

【问题讨论】:

  • 我已经完成了与 iPad 的每一帧的距离,它工作正常。你能告诉我们你的代码吗?
  • self.myARsceneView.scene.rootNode.childNodes[0].position 我的节点的位置和 self.myARsceneView.scene.rootNode.childNodes[1].position 我的相机的位置,我提醒你,在我的手机 X 中它工作得很好,我可以在位置看到更新
  • 现在我不确定将childNodes[1] 用作相机。这将提供您当前设备的摄像头位置sceneView.pointOfView?.worldPosition
  • 现在我只有 iPhone X 和 iPad Pro,所以我无法测试它。但在简单的理论中,它应该总是更新相机的位置
  • 感谢您的帮助,但我几乎可以肯定这是设备问题,我会测试更多设备

标签: ios swift arkit


【解决方案1】:

在您的 ViewController 中实现 ARSCNViewDelegate,它将每帧调用一次 renderer:updateAtTime 回调。 在此函数中,您可以通过调用sceneView.session.currentFrame.camera.transform(即simd_float4x4)获取相机相对于现实世界的位置。您可以使用transform.columns.3 访问相机的当前位置并从中窥视 x、y、z 字段。使用这些坐标,您可以计算距离,例如使用这些函数的欧几里得距离

func distanceTravelled(xDist:Float, yDist:Float, zDist:Float) -> Float{
    return sqrt((xDist*xDist)+(yDist*yDist)+(zDist*zDist))
}

func distanceTravelled(between v1:SCNVector3,and v2:SCNVector3) -> Float{

    let xDist = v1.x - v2.x
    let yDist = v1.y - v2.y
    let zDist = v1.z - v2.z

    return distanceTravelled(xDist: xDist, yDist: yDist, zDist: zDist)
}

记得将节点的坐标转换为 worldCoordinates -> node.worldPosition 与节点 SCNNode 的实例

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 2018-02-22
    • 2018-11-17
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多