RealityKit 和 Vision – 如何调用 RayCast API

RealityKit and Vision – How to call RayCast API

这个问题也在 the Apple Forum 中被问到,但到目前为止,我还没有看到任何回应。

问题真的来了,从ARSession中的一个frame中找到感兴趣的点之后。如何将其转换为 3D 世界坐标。

我是怎么得分的:

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

然后我需要从 ARFrame.capturedImage 导出的 2D 点 Raycast 到 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点。但是我不知道capturedImage是怎么被转换成UI点的。我用于积分的计算不正确。

谢谢。

问题出在图像方向上。在我的例子中,在纵向方向使用 iPad 后置摄像头,我需要做 .downMirrored(而不是 .up)。

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

一旦方向正确,图像识别的点值就可以直接使用光线投射。