【问题标题】:How to recognize a lot of objects and add a lot of nodes at the same time?如何识别很多物体,同时添加很多节点?
【发布时间】:2020-09-22 00:14:17
【问题描述】:

这是我用于ARImageTrackingConfiguration()时的简单对象。

在代码中,我将一个平面和 paperPlane 添加到识别的对象上:

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        let node = SCNNode()
        if let imageAnchor = anchor as? ARImageAnchor {
            let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, 
                                height: imageAnchor.referenceImage.physicalSize.height)
            plane.firstMaterial?.diffuse.contents = UIColor.green.withAlphaComponent(0.8)
            let planeNode = SCNNode(geometry: plane)
            planeNode.eulerAngles.x = -.pi / 2
            planeNode.position.y = 0
            let paperPlaneScene = SCNScene(named: "Scenes.scnassets/paperPlane.scn")!
            let paperPlaneNode = paperPlaneScene.rootNode.childNodes.first!
            paperPlaneNode.position = SCNVector3Zero
            paperPlaneNode.position.z = 0.1
            paperPlaneNode.eulerAngles.y = -.pi / 2
            paperPlaneNode.eulerAngles.z = .pi
            planeNode.addChildNode(paperPlaneNode)
            node.addChildNode(planeNode)
        }
        return node
    }

但结果如下:

为什么一次只能识别一个对象?而且不是每个人?他们被一一认出,但从来没有一次全部认出。为什么?

【问题讨论】:

    标签: ios swift augmented-reality scenekit arkit


    【解决方案1】:

    在最新版本的 ARKit 5.0 中,您可以simultaneously 使用 ARImageTrackingConfiguration 或 ARWorldTrackingConfiguration 等类检测多达 100 张图像。

    要一次检测多达 100 个图像,请使用以下实例属性:

    var maximumNumberOfTrackedImages: Int { get set }
    

    在实际代码中是这样的:

    guard let reference = ARReferenceImage.referenceImages(inGroupNamed: "ARRes", 
                                                                 bundle: nil) 
    else { fatalError("Missing resources") }
    
    let config = ARWorldTrackingConfiguration()
    config.maximumNumberOfTrackedImages = 10
    config.detectionImages = reference
    
    arView.session.run(config, options: [.resetTracking, .removeExistingAnchors])
    

    这是一个带有renderer(_:didAdd:for:) 实例方法的扩展:

    extension ViewController: ARSCNViewDelegate {
    
        func renderer(_ renderer: SCNSceneRenderer,
                     didAdd node: SCNNode,
                      for anchor: ARAnchor) {
    
            guard let imageAnchor = anchor as? ARImageAnchor,
                  let imageName = imageAnchor.referenceImage.name
            else { return }
    
            let geometryNode = nodeGetter(name: imageName)
            node.addChildNode(geometryNode)
        }
    
        func nodeGetter(name: String) -> SCNNode {
    
            var node = SCNNode()
    
            switch name {
                case "geometry_01": node = modelOne
                case "geometry_02": node = modelTwo
                case "geometry_03": node = modelThree
                case "geometry_04": node = modelFour
                case "geometry_05": node = modelFive
                case "geometry_06": node = modelSix
                case "geometry_07": node = modelSeven
                case "geometry_08": node = modelEight
                default: break
            }
            return node
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-18
      • 1970-01-01
      • 2022-01-18
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多