如何删除 ARKit 场景视图中的特定节点
How to delete a specific node in an ARKit sceneView
我的场景视图中有很多节点,包括标准 "focus square"(帮助用户放置对象并在用户移动 phone 时位于表面上的节点) .除了那一个,我想删除所有这些。
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()
}
}
但是,即使我正在检查节点 class,这也会删除焦点方块。为什么我不能删除特定节点?
我认为问题是在这里删除节点不像视图那样有效。关于如何在场景视图中添加节点,没有 "hierarchy"。不过我不确定。这是将焦点方块添加到视图的方式:
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)
}
}
}
}
我不是 SceneKit 的大专家,但如果 FocusSquare 是另一个节点的子节点,那么这个(FocusSquare 父节点)可能在枚举期间被删除,导致 FocusSquare 也被删除。
将FocusSquare添加到rootNode是否可以解决?
希望这个回答对您有所帮助。
我没有试图找到焦点方块,而是试图找到我的另一个自定义节点 class:
sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
if node is TranslationNode {
node.removeFromParentNode()
}
}
这很好用。
我的场景视图中有很多节点,包括标准 "focus square"(帮助用户放置对象并在用户移动 phone 时位于表面上的节点) .除了那一个,我想删除所有这些。
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()
}
}
但是,即使我正在检查节点 class,这也会删除焦点方块。为什么我不能删除特定节点?
我认为问题是在这里删除节点不像视图那样有效。关于如何在场景视图中添加节点,没有 "hierarchy"。不过我不确定。这是将焦点方块添加到视图的方式:
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)
}
}
}
}
我不是 SceneKit 的大专家,但如果 FocusSquare 是另一个节点的子节点,那么这个(FocusSquare 父节点)可能在枚举期间被删除,导致 FocusSquare 也被删除。
将FocusSquare添加到rootNode是否可以解决?
希望这个回答对您有所帮助。
我没有试图找到焦点方块,而是试图找到我的另一个自定义节点 class:
sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
if node is TranslationNode {
node.removeFromParentNode()
}
}
这很好用。