我目前正在为visionOS开发一个项目。该项目涉及在设备锚点的特定 FOV 内获取有效的 PlaneAnchors。本质上,我们得到了设备(耳机)锚点相对于世界原点的 4x4 变换矩阵。我们还有通过 Apple 的平面检测包检测到的 PlaneAnchors 列表。这些 PlaneAnchor 还给出了相对于同一世界原点的 4x4 变换矩阵。
我想做的是编写代码来检查有多少个 PlaneAnchor 落在给定设备锚点的用户的可见边界内。我该怎么做呢?我知道 VisionPro 的垂直 FOV 为 90°,水平 FOV 约为 110°,这是我想要选择已检测到的有效 PlaneAnchor 的区域。
我目前正在使用此代码,但由于某种原因仅检测到我的设备后面的 PlaneAnchors,因此超出了我的视野。
final class FOVUtils {
// Define FOV and Clipping Planes
let fovHorizontal: Float = .pi / 3 // 60 degrees
let fovVertical: Float = .pi / 4 // 45 degrees
let nearPlane: Float = 0.1
let farPlane: Float = 10.0
// Helper Function: Convert to WorldAnchor's Local Coordinates
func convertToWorldAnchorCoordinates(anchorPosition: SIMD3<Float>, devicePosition: SIMD3<Float>, inverseOrientation: simd_quatf) -> SIMD3<Float> {
let relativePosition = anchorPosition - devicePosition
let transformedPosition = inverseOrientation.act(relativePosition)
return transformedPosition
}
// Helper Function: Check if Inside Field of View
func isInFieldOfView(anchorPosition: SIMD3<Float>, devicePosition: SIMD3<Float>, inverseOrientation: simd_quatf) -> Bool {
print("DEBUG: anchor pos: ", anchorPosition)
print("DEBUG: devicePosition: ", devicePosition)
print("DEBUG: inverseOrientation: ", inverseOrientation)
let transformedPosition = convertToWorldAnchorCoordinates(anchorPosition: anchorPosition, devicePosition: devicePosition, inverseOrientation: inverseOrientation)
print("DEBUG: transformed position: ", transformedPosition)
let zDistance = transformedPosition.z
if zDistance < nearPlane || zDistance > farPlane {
return false
}
print("DEBUG: passed 1")
let tanHalfHorizontalFOV = tan(fovHorizontal)
let tanHalfVerticalFOV = tan(fovVertical)
let xLimit = zDistance * tanHalfHorizontalFOV
let yLimit = zDistance * tanHalfVerticalFOV
// let passed = abs(transformedPosition.x) <= xLimit && abs(transformedPosition.y) <= yLimit
// print("DEBUG: passed 2 is", passed)
return true
}
}
如果有人有任何关于如何做到这一点的技术,或者可以提供一些关于如何利用 Vision Pro 解决这个问题的见解,我将非常感激。谢谢!
HangarRash,您找到问题的答案了吗? 我正试图找到 PlaneAnchors 的位置,它们也都出现在我身后。