首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除ARKit sceneView中的特定节点

如何删除ARKit sceneView中的特定节点
EN

Stack Overflow用户
提问于 2018-12-22 22:08:20
回答 2查看 1.4K关注 0票数 2

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

代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
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()
    }
}

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

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

代码语言:javascript
复制
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)
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-22 23:21:52

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

代码语言:javascript
复制
sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
    if node is TranslationNode {
        node.removeFromParentNode()
    }
}

这可以很好地工作。

票数 2
EN

Stack Overflow用户

发布于 2018-12-22 22:21:00

我不是SceneKit方面的专家,但是如果FocusSquare是另一个节点的子节点,那么这个(FocusSquare父节点)可能已经在导致FocusSquare删除的枚举过程中删除了。

将FocusSquare添加到rootNode中可以解决这个问题吗?

希望这个答案能有所帮助。

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

https://stackoverflow.com/questions/53896331

复制
相关文章

相似问题

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