ARKit - 获取相机到锚点的距离

2024-04-05

我正在创建一个锚点并将其添加到相机前面一定距离处的 ARSKView 中,如下所示:

func displayToken(distance: Float) {
        print("token dropped at: \(distance)")
        guard let sceneView = self.view as? ARSKView else {
            return
        }

        // Create anchor using the camera's current position
        if let currentFrame = sceneView.session.currentFrame {
            // Create a transform with a translation of x meters in front of the camera
            var translation = matrix_identity_float4x4
            translation.columns.3.z = -distance
            let transform = simd_mul(currentFrame.camera.transform, translation)

            // Add a new anchor to the session
            let anchor = ARAnchor(transform: transform)
            sceneView.session.add(anchor: anchor)
        }
    }

然后为锚点创建节点,如下所示:

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
        // Create and configure a node for the anchor added to the view's session.
        if let image = tokenImage {
            let texture = SKTexture(image: image)
            let tokenImageNode = SKSpriteNode(texture: texture)
            tokenImageNode.name = "token"
            return tokenImageNode
        } else {
            return nil
        }
    }

这工作正常,我看到图像被添加到适当的距离。然而,我想做的是计算当你移动时锚点/节点在相机前面的距离。问题是使用 fabs(cameraZ -anchor.transform.columns.3.z) 的计算似乎立即停止。请参阅下面的 update() 方法中的代码来计算相机和物体之间的距离:

override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered
        guard let sceneView = self.view as? ARSKView else {
            return
        }

        if let currentFrame = sceneView.session.currentFrame {
            let cameraZ =  currentFrame.camera.transform.columns.3.z
            for anchor in currentFrame.anchors {
                if let spriteNode = sceneView.node(for: anchor), spriteNode.name == "token", intersects(spriteNode) {
                    // token is within the camera view
                    //print("token is within camera view from update method")
                    print("DISTANCE BETWEEN CAMERA AND TOKEN: \(fabs(cameraZ - anchor.transform.columns.3.z))")
                    print(cameraZ)
                    print(anchor.transform.columns.3.z)
                }
            }
        }
    }

为了准确获得相机和锚点之间的距离,我们将不胜感激。


4x4 变换矩阵的最后一列是平移向量(或相对于父坐标空间的位置),因此只需减去这些向量即可获得两个变换之间的三维距离。

let anchorPosition = anchor.transforms.columns.3
let cameraPosition = camera.transform.columns.3

// here’s a line connecting the two points, which might be useful for other things
let cameraToAnchor = cameraPosition - anchorPosition
// and here’s just the scalar distance
let distance = length(cameraToAnchor)

你所做的事情并不正确,因为你正在减去每个向量的 z 坐标。如果两个点的 x、y 和 z 不同,则仅减去 z 并不能得到距离。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARKit - 获取相机到锚点的距离 的相关文章

随机推荐