【问题标题】:How to use trackedRaycast(_:updateHandler:) method in ARKit?如何在 ARKit 中使用 trackedRaycast(_:updateHandler:) 方法?
【发布时间】:2020-06-03 04:52:22
【问题描述】:

随着时间的推移重复光线投射查询,以通知您物理环境中更新的表面。

如何在 ARKit 中使用这个函数?

func trackedRaycast(_ query: ARRaycastQuery, 
              updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?

【问题讨论】:

    标签: swift scenekit augmented-reality arkit realitykit


    【解决方案1】:

    Apple 开发者文档对trackedRaycast() 有以下说明:

    trackedRaycast(_:updateHandler:) 实例方法随着时间的推移重复光线投射查询,以通知您物理环境中更新的表面。跟踪的光线投射包装了 ARSession 重复调用的光线投射查询,每次调用更新处理程序为您提供新结果。当您准备好停止跟踪的光线投射时,请致电 stopTracking()

    所以,这里有一个可以在项目中使用的代码 sn-p:

    import RealityKit
    import ARKit
    
    @IBOutlet var arView: ARView!
    let scene = try! Experience.loadScene()
    
    let raycastQuery: ARRaycastQuery = .init(origin: [0,0,0],
                                          direction: [7,7,7],
                                           allowing: .estimatedPlane,
                                          alignment: .horizontal)
    
    let repeatRaycast = self.arView.session.trackedRaycast(raycastQuery) { results in
    
        // Update Handler's content
        guard let result: ARRaycastResult = results.first
        else { return }
    
        let anchor = AnchorEntity(world: result.worldTransform)
        anchor.addChild(self.scene)
    
        self.arView.scene.anchors.append(anchor)
    }
    

    然后你就可以停止跟踪了:

    repeatRaycast?.stopTracking()
    

    【讨论】:

    • 我一般不推荐使用 .init(origin: , direction: , allowing: , alignment: ) 初始化器,除非 1) 你非常了解 origindirection 向量,并且 2) 你需要从除了用户的/之外的东西进行光线投射手机的视角。 .init(from: , allowing: , alignment: ) 初始化器通常是你所需要的。
    • 感谢您提供有用的提示,@jfriesenhahn。
    【解决方案2】:

    首先用类似的东西定义一个查询

    let bounds = sceneView.bounds
    let screenCenter = CGPoint(x: bounds.midX, y: bounds.midY)
    let query = sceneView.raycastQuery(from: screenCenter, allowing: .estimatedPlane, alignment: .horizontal)
    

    然后使用更新处理程序启动 trackedRaycast:

    let trackedRaycast = sceneView.castTrackedRay(for: query, updateHandler: { results in
        guard let result = results.first else { return }
        // Do something with results
        // Maybe adjust a relevent node's position
        someNode.simdWorldPosition = result.worldTransform.position
    })
    

    然后,如果在某个时候您不再需要跟踪它/更新位置,您可以停止 updateHandler 执行:trackedRaycast?.stopTracking()

    请注意,如果由于查询限制或场景问题导致普通光线投射失败,那么 trackedRaycast 也会失败,您的 trackedRaycast 对象将是 nil

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多