单击按钮时是否可以更改 ARKit 场景的对象 Swift
Is it possible to change the ARKit scene's object when clicking on a button Swift
我是第一次构建 ARkit 项目,我需要做的是,首先,我必须在 ARSCNView 中显示一个 3D 球体。然后当我点击一个按钮时,球体应该消失并在它的位置显示一个 3D 立方体。
我正在考虑我的代码:
@IBOutlet weak var sceneView: ARSCNView!
var objectNode: SCNNode?
var objectScene: SCNScene?
objectScene = SCNScene(named: "sphere.dae")
objectNode = objectScene!.rootNode
sceneView.scene.rootNode.addChildNode(objectNode!)
这里是按钮的代码:
@IBAction func cubeButtonClicked(_ sender: UIButton) {
sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
node.removeFromParentNode()
}
objectScene = SCNScene(named: "cube.dae")
objecteNode = objectScene!.rootNode
sceneView.scene.rootNode.addChildNode(objecteNode!)
}
我遇到了这个错误
[SceneKit] Error: removing the root node of a scene from its scene is not allowed
我是不是做错了什么?
实际上错误会准确说明是什么原因造成的。
已编辑---尝试以下两种方式之一
- 使用以下代码避免删除
pointOfView
,这是您的 SCNCamera
。
sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
if node == sceneView.pointOfView {return}
node.removeFromParentNode()
}
- 如果您只有一个节点要删除,在您的情况下是
sphereNode
,则无需使用枚举方法。只需保留对该节点的引用,并在需要时删除。
sphereNode.removeFromParentNode()
我在上面的代码中缺少的是我必须进行删除并添加两个同步任务。因为 Delete 函数是一个闭包(异步任务)。所以添加函数将在删除之前执行。
到那时错误就会消失。
我是第一次构建 ARkit 项目,我需要做的是,首先,我必须在 ARSCNView 中显示一个 3D 球体。然后当我点击一个按钮时,球体应该消失并在它的位置显示一个 3D 立方体。
我正在考虑我的代码:
@IBOutlet weak var sceneView: ARSCNView!
var objectNode: SCNNode?
var objectScene: SCNScene?
objectScene = SCNScene(named: "sphere.dae")
objectNode = objectScene!.rootNode
sceneView.scene.rootNode.addChildNode(objectNode!)
这里是按钮的代码:
@IBAction func cubeButtonClicked(_ sender: UIButton) {
sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
node.removeFromParentNode()
}
objectScene = SCNScene(named: "cube.dae")
objecteNode = objectScene!.rootNode
sceneView.scene.rootNode.addChildNode(objecteNode!)
}
我遇到了这个错误
[SceneKit] Error: removing the root node of a scene from its scene is not allowed
我是不是做错了什么?
实际上错误会准确说明是什么原因造成的。
已编辑---尝试以下两种方式之一
- 使用以下代码避免删除
pointOfView
,这是您的SCNCamera
。
sceneView.scene.rootNode.enumerateChildNodes { (node, _) in
if node == sceneView.pointOfView {return}
node.removeFromParentNode()
}
- 如果您只有一个节点要删除,在您的情况下是
sphereNode
,则无需使用枚举方法。只需保留对该节点的引用,并在需要时删除。
sphereNode.removeFromParentNode()
我在上面的代码中缺少的是我必须进行删除并添加两个同步任务。因为 Delete 函数是一个闭包(异步任务)。所以添加函数将在删除之前执行。 到那时错误就会消失。