首页 文章

ARKit - 获取场景中ARCamera的当前位置

提问于
浏览
22

我正在同时学习ARKit和Scenekit,这是一个挑战 .

创建了ARWorldTrackingSessionConfiguration会话后,我想知道是否有人知道在场景会话中获取用户“相机”位置的方法 . 我的想法是想要将对象设置为用户当前位置的动画 .

let reaperScene = SCNScene(named: "reaper.dae")!
let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)!
reaperNode.position = SCNVector3Make(0, 0, -1)
let scene = SCNScene()
scene.rootNode.addChildNode(reaperNode)

// some unknown amount of time later   
let currentCameraPosition = sceneView.pointOfView?.position
let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0)
reaperNode.runAction(moveAction)

但是,即使我正在移动相机,似乎currentCameraPosition总是[0,0,0] . 知道我做错了什么吗?最终的想法是,我会围绕一个不可见的球体旋转对象,直到它在摄像机前面,然后将其设置为动画,执行与此类似的操作:Rotate SCNCamera node looking at an object around an imaginary sphere(这样用户可以看到对象生成对象)

谢谢你的帮助 .

2 回答

  • 11

    将自己设置为 ARSession.delegate . 你可以实现 session(_:didUpdate:) ,它将为你的会话中处理的每一帧提供 ARFrame . 该框架具有 camera 属性,用于保存有关摄像机变换,旋转和位置的信息 .

    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        // Do something with the new transform
        let currentTransform = frame.camera.transform
        doSomething(with: currentTransform)
    }
    

    正如rickster指出的那样,你总是可以通过调用 session.currentFrame 获得当前的 ARFrame 和相机位置 . 如果您只需要一次位置,这很有用,例如移动相机所在的节点,但如果您想获得相机位置的更新,则应使用 delegate 方法 .

  • 20

    我知道它已经解决但我有一个小巧的解决方案..我会优先添加一个渲染器委托方法..它是ARSCNViewDelegate中的一个方法

    func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
        guard let pointOfView = sceneView.pointOfView else { return }
        let transform = pointOfView.transform
        let orientation = SCNVector3(-transform.m31, -transform.m32, transform.m33)
        let location = SCNVector3(transform.m41, transform.m42, transform.m43)
        let currentPositionOfCamera = orientation + location
        print(currentPositionOfCamera)
    }
    

    当然你不能默认添加两个SCNVector3开箱即用..所以你需要粘贴出类以下

    func +(lhv:SCNVector3, rhv:SCNVector3) -> SCNVector3 {
         return SCNVector3(lhv.x + rhv.x, lhv.y + rhv.y, lhv.z + rhv.z)
    }
    

相关问题