【问题标题】:How to delete a specific node in an ARKit sceneView如何删除 ARKit 场景视图中的特定节点
【发布时间】:2018-12-22 14:08:19
【问题描述】:

我的场景视图中有很多节点,包括标准的“焦点方块”(帮助用户放置对象并在用户移动手机时放置在表面上的节点)。我想删除所有这些,除了那个。

class FocusSquare: SCNNode {
    // MARK: - Types

    enum State: Equatable {
        case initializing
        case detecting(hitTestResult: ARHitTestResult, camera: ARCamera?)
    }

    ...
    // Find code here: https://github.com/BlackMirrorz/ARKitWorldMaps/tree/c7ea837006e26ec7d8542ad2d3c417d5fd3910d5/CloudCube/CloudCube/Apple%20Focus%20Square
}

这就是我删除除焦点方块之外的所有节点的方法:

sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
    if let node = node as? FocusSquare {
        print("should not remove node") // fired once, however it still gets deleted
    } else {
        node.removeFromParentNode()
    }
}

但是,即使我正在检查节点类,这也会删除焦点方块。为什么我不能删除特定节点?

我认为问题在于这里删除节点不像视图那样工作。在场景视图中添加节点的方式没有“层次结构”。不过我不确定。这是将焦点方块添加到视图中的方式:

public func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    DispatchQueue.main.async { self.updateFocusSquare() }
}

func updateFocusSquare() {
    var screenCenter: CGPoint {
        let bounds = self.sceneView.bounds
        return CGPoint(x: bounds.midX, y: bounds.midY)
    }

    if let camera = self.augmentedRealitySession.currentFrame?.camera,
        case .normal = camera.trackingState,
        let result = self.sceneView.smartHitTest(screenCenter) {
        updateQueue.async {
            if self.canDisplayFocusSquare {
                self.sceneView.scene.rootNode.addChildNode(self.focusSquare)
                self.focusSquare.state = .detecting(hitTestResult: result, camera: camera)
            }
        }

    } else {
        updateQueue.async {
            if self.canDisplayFocusSquare {
                self.focusSquare.state = .initializing
                self.sceneView.pointOfView?.addChildNode(self.focusSquare)
            }
        }
    }
}

【问题讨论】:

    标签: ios arkit


    【解决方案1】:

    我实际上并没有试图找到焦点方块,而是试图找到我的另一个自定义节点类:

    sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
        if node is TranslationNode {
            node.removeFromParentNode()
        }
    }
    

    这很好用。

    【讨论】:

      【解决方案2】:

      我不是 SceneKit 方面的专家,但如果 FocusSquare 是另一个节点的子节点,那么这个(FocusSquare 父节点)可能在枚举期间被删除,从而导致 FocusSquare 也被删除。

      将FocusSquare添加到rootNode谁解决?

      希望这个答案有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 2020-11-16
        • 2021-12-13
        • 2019-06-19
        • 1970-01-01
        相关资源
        最近更新 更多