我有一个基于 Apple 示例代码的测试应用程序。它将节点放入 3D 空间并测量它们之间的距离。这在 LiDAR 设备(iPhone12Pro 等)上运行良好。在 iPhone11(非 LiDAR)上,节点并不总是位于一个平面上,并且离相机太近,并且不会将焦点方块更改为水平或垂直平面对齐。 我已经检查了 Apple 的默认测量应用程序,这会将节点正确地放在平面上并正确检测平面对齐。
我有如下示例代码,用于从屏幕位置获取世界位置。
/// Convert screen 2D coordinate to 3D world postion
func screenToWorld(point: CGPoint) -> simd_float3? {
if hasLidarSupport {
guard sceneView.session.currentFrame != nil else { return nil }
guard let raycastQuery = sceneView.raycastQuery(from: point, allowing: .estimatedPlane, alignment: .any) else { return nil }
let raycastResults = sceneView.session.raycast(raycastQuery)
guard let result = raycastResults.first else { return nil }
let worldCoordinates = simd_float3(result.worldTransform.columns.3.x, result.worldTransform.columns.3.y, result.worldTransform.columns.3.z)
return worldCoordinates
}else {
let hitTestResults = sceneView.hitTest(point, types: [.estimatedVerticalPlane, .estimatedHorizontalPlane, .existingPlane, .existingPlaneUsingExtent, .existingPlaneUsingGeometry])
if let result = hitTestResults.first {
let worldCoordinates = simd_float3(x: result.worldTransform.columns.3.x, y: result.worldTransform.columns.3.y, z: result.worldTransform.columns.3.z)
return worldCoordinates
}
return nil
}
}