【问题标题】:Convert coordinates in ARImageTrackingConfiguration在 ARImageTrackingConfiguration 中转换坐标
【发布时间】:2018-06-28 07:30:19
【问题描述】:

在 ARKit 2 中添加了一个新配置:ARImageTrackingConfiguration,根据 SDK 可以有更好的性能和一些新的用例。

在 Xcode 10b2 上进行实验(请参阅 https://forums.developer.apple.com/thread/103894 如何修复资产加载)我的代码现在正确调用了跟踪图像的委托,此后添加了一个节点,但我找不到坐标系的任何文档已定位,因此有人知道如何将节点放入场景中以覆盖检测到的图像:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    DispatchQueue.main.async {
        if let imageAnchor = anchor as? ARImageAnchor {
            let imageNode = SCNNode.createImage(size: imageAnchor.referenceImage.physicalSize)
            imageNode.transform = // ... ???
            node.addChildNode(imageNode)
        }
    }
}

ps:与ARWorldTrackingConfiguration 相比,原点似乎在不断移动(很可能将相机置于 0,0,0)。

pps:SCNNode.createImage 是一个辅助函数,没有任何坐标计算。

【问题讨论】:

    标签: ios swift arkit


    【解决方案1】:

    假设我已正确阅读您的问题,您可以执行以下操作:

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    
        let nodeToReturn = SCNNode()
    
        //1. Check We Have Detected Our Image
        if let validImageAnchor = anchor as? ARImageAnchor {
    
            //2. Log The Information About The Anchor & Our Reference Image
            print("""
                ARImageAnchor Transform = \(validImageAnchor.transform)
                Name Of Detected Image = \(validImageAnchor.referenceImage.name)
                Width Of Detected Image = \(validImageAnchor.referenceImage.physicalSize.width)
                Height Of Detected Image = \(validImageAnchor.referenceImage.physicalSize.height)
             """)
    
            //3. Create An SCNPlane To Cover The Detected Image
            let planeNode = SCNNode()
    
            let planeGeometry = SCNPlane(width: validImageAnchor.referenceImage.physicalSize.width,
                                        height: validImageAnchor.referenceImage.physicalSize.height)
    
            planeGeometry.firstMaterial?.diffuse.contents = UIColor.white
    
            planeNode.geometry = planeGeometry
    
            //a. Set The Opacity To Less Than 1 So We Can See The RealWorld Image
            planeNode.opacity = 0.5
    
            //b. Rotate The PlaneNode So It Matches The Rotation Of The Anchor
            planeNode.eulerAngles.x = -.pi / 2
    
            //4. Add It To The Node
            nodeToReturn.addChildNode(planeNode)
    
            //5. Add Something Such As An SCNScene To The Plane
            if let modelScene = SCNScene(named: "art.scnassets/model.scn"), let modelNode = modelScene.rootNode.childNodes.first{
    
                //a. Set The Model At The Center Of The Plane & Move It Forward A Tad
                modelNode.position = SCNVector3Zero
                modeNode.position.z = 0.15
    
                //b. Add It To The PlaneNode
                planeNode.addChildNode(modelNode)
            }
        }
    
        return nodeToReturn
    
    }
    

    希望这将为您指明正确的方向...

    【讨论】:

    • 惊喜:效果很好,谢谢@josh-robbins。让我感到惊讶,因为我认为 ARImageTrackingConfiguration 中的坐标系更复杂,而您发布的代码或多或少是我已经为 ARWorldTrackingConfiguration 运行的代码 - 再次感谢您消除我的困惑!
    • :) 很高兴它有帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多