如何在visionOS中识别指定FOV内的相关锚点?

问题描述 投票:0回答:1

我目前正在为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 解决这个问题的见解,我将非常感激。谢谢!

swift visionos fieldofview
1个回答
0
投票

HangarRash,您找到问题的答案了吗? 我正试图找到 PlaneAnchors 的位置,它们也都出现在我身后。

© www.soinside.com 2019 - 2024. All rights reserved.