RealityKit和Vision –如何调用RayCast API

问题描述

the Apple Forum中也提出了这个问题,但是到目前为止,我还没有看到任何答复。

问题实际上是在ARSession的框架中找到感兴趣的点之后。如何将其转换为3D世界坐标。

我是怎么知道的:

let handler = VNImageRequestHandler(cvPixelBuffer: frame.capturedImage,orientation: .up,options: [:])
let handPoseRequest = VNDetectHumanHandPoseRequest()
....
try handler.perform([handPoseRequest])

然后,我需要从ARFrame.capturedImage派生的2D点到3D世界坐标进行射线广播:

fileprivate func convertVNPointTo3D(_ point: VNRecognizedPoint,_ session: ARSession,_ frame: ARFrame,_ viewSize: CGSize) -> Transform? {

    let pointX = (point.x / Double(frame.camera.imageResolution.width))*Double(viewSize.width)
    let pointY = (point.y / Double(frame.camera.imageResolution.height))*Double(viewSize.height)
    let query = frame.raycastQuery(from: CGPoint(x: pointX,y: pointY),allowing: .estimatedplane,alignment: .any)
    let results = session.raycast(query)

    if let first = results.first {
        return Transform(matrix: first.worldTransform)
    } else {
        return nil
    }
}

根据API,我应该使用UI点。但是,我不知道捕获的图像如何转换为UI点。我用于积分的计算不正确。

谢谢。

解决方法

问题是图像方向。就我而言,在纵向使用iPad后置摄像头,我需要执行.downMirrored(而不是.up)。

let handler = VNImageRequestHandler(cvPixelBuffer: frame.capturedImage,orientation: .downMirrored,options: [:])

一旦正确地确定了方向,就可以直接使用射线投射法从图像识别中获取点值。