首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >转换ARImageTrackingConfiguration格式的坐标

转换ARImageTrackingConfiguration格式的坐标
EN

Stack Overflow用户
提问于 2018-06-27 22:21:07
回答 1查看 262关注 0票数 0

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

在Xcode10B2上进行实验(请参阅如何修复资源加载)我的代码现在可以正确地调用委托,即图像被跟踪,此后添加了节点,但我找不到任何文档来定位坐标系,因此有人知道如何将节点放到场景中以覆盖检测到的图像:

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是一个不需要任何坐标计算的辅助函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-28 06:39:35

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

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

}

希望这能为你指明正确的方向……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51065239

复制
相关文章

相似问题

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