移除平面检测平面可防止放置其他平面

时间:2019-04-11 22:03:38

标签: ios swift arkit

我正在使用ARKit生成飞机,如果手动移除飞机,我将无法在相同位置检测到飞机。

要检测飞机,我设置了场景配置

 let config = ARWorldTrackingConfiguration()
        config.worldAlignment = .gravity
        config.providesAudioData = false
        config.isLightEstimationEnabled = true
       ...
        else if ARMode == .floor {
            self.ARMode = .floor
            scannerBox.isHidden=true
            focusNode?.isHidden=false
            plusButton.isHidden=true
            config.planeDetection = .horizontal            self.planeTexture="test.scnassets/Textures/Surface_Texture.png"
        }
        ...

        sceneView.session.run(config)

在渲染器功能中将平面添加到场景中

       let planeNode = self.createARPlaneNode(planeAnchor: planeAnchor,
                                                   color: UIColor.yellow.withAlphaComponent(0.5))

            node.addChildNode(planeNode)

如果按下某个按钮,则飞机和其他物体应被移除

scene.rootNode.enumerateChildNodes { (node, _) in
        print(node.name)
        if (node.name == "sphere" ) {
            node.removeFromParentNode()
        }
         if ( node.name == "surfacePlane") {

                 node.removeFromParentNode()
           }

        if(node.name != nil){
            if (node.name?.contains("ProductModel_"))!  {
                node.removeFromParentNode()

            }
        }    
    }

以上代码触发时,飞机,球体和产品会按预期消失。 如果我尝试扫描房间其他地方的表面,它会按预期工作,但是如果我尝试扫描飞机所在的位置并生成新飞机,它将无法正常工作。它不会生成新飞机,并且如果附近的飞机扩展以覆盖相同的区域,它们也会消失。

我认为问题可能在于移除的平面的场景几何形状仍会以某种方式存在并阻止在同一空间中出现新的平面。 作为围绕I的临时工作,停止和启动AR会话,这将删除飞机。

     let config = sceneView.session.configuration as!
        ARWorldTrackingConfiguration
        config.planeDetection = .horizontal
        sceneView.session.run(config,
                              options: [.resetTracking, .removeExistingAnchors])

我试图确定为什么会发生这种情况,并且将平面与我在场景中明确放置的对象不同。

1 个答案:

答案 0 :(得分:1)

我相信您还需要删除附加了平面节点的ARPlaneAnchor,以便ARKit将创建一个新的ARPlaneAnchor并启动创建平面节点的渲染器功能。

类似

      if ( node.name == "surfacePlane") {
          if let planeAnchor = sceneView.anchor(for: node) as? ARPlaneAnchor {
              sceneView.session.remove(anchor: planeAnchor)
          }
          node.removeFromParentNode()
      }