首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ARKit -获取摄像机到锚点的距离

ARKit -获取摄像机到锚点的距离
EN

Stack Overflow用户
提问于 2018-06-20 05:29:24
回答 5查看 6.4K关注 0票数 3

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

代码语言:javascript
运行
复制
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)
        }
    }

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

代码语言:javascript
运行
复制
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()方法中,用于计算相机和对象之间的距离:

代码语言:javascript
运行
复制
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)
                }
            }
        }
    }

感谢任何帮助,以便准确地获得相机和锚之间的距离。

EN

Stack Overflow用户

发布于 2018-06-20 13:14:33

这个是为scenekit准备的,不过我还是把它留在这里吧。

代码语言:javascript
运行
复制
let end = node.presentation.worldPosition
let start = sceneView.pointOfView?.worldPosition

let dx = (end?.x)! - (start?.x)!
let dy = (end?.y)! - (start?.y)!
let dz = (end?.z)! - (start?.z)!

let distance = sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2))
票数 4
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50937214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档