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: [:])
一旦方向正确,图像识别的点值就可以直接使用光线投射。
这个问题也在 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: [:])
一旦方向正确,图像识别的点值就可以直接使用光线投射。