iOS ARKit开发:如何获取场景中SCNBox与SCNNode并控制显隐?
嗨,我来帮你搞定这几个ARKit开发里的小问题~
获取SceneView中的planeNode和planeGeometry
首先,最省心的方式其实是在创建时保留引用——如果你把planeNode和planeGeometry定义成当前类的实例变量(而不是局部变量),后续直接就能访问,不用额外查找:
// 把变量定义在类的实例作用域里 var planeGeometry: SCNBox? var planeNode: SCNNode? // 初始化的时候赋值 func setupPlane() { planeGeometry = SCNBox(width: 1, height: 1, length: 0.1, chamferRadius: 0) planeNode = SCNNode(geometry: planeGeometry) planeNode?.name = "ARPlane" // 给节点加个名字,方便后续查找备用 self.addChildNode(planeNode!) }
这样后续你直接用self.planeNode就能拿到节点,self.planeNode?.geometry就能拿到对应的SCNBox啦。
如果因为某些原因没保留引用,也可以通过以下方式查找:
- 按节点名称查找:如果给节点设置了name,用递归查找快速定位:
if let targetNode = sceneView.scene.rootNode.childNode(withName: "ARPlane", recursively: true) { // 找到了planeNode let targetGeometry = targetNode.geometry as? SCNBox }
- 按几何类型过滤:如果有多个同类型的平面节点,遍历所有子节点筛选:
let allPlaneNodes = sceneView.scene.rootNode.childNodes.filter { node in node.geometry is SCNBox } // 遍历筛选后的节点,拿到对应的geometry allPlaneNodes.forEach { node in if let boxGeometry = node.geometry as? SCNBox { // 处理每个SCNBox } }
控制节点的显示与隐藏
这个超简单,SCNNode自带isHidden属性,直接设置就能控制:
// 隐藏节点 planeNode?.isHidden = true // 显示节点 planeNode?.isHidden = false
如果是多个节点,遍历设置就行:
allPlaneNodes.forEach { $0.isHidden = true }
另外提个小细节:你原来的代码里let planeNode = SCNNode(geometry: self.geometry)这里的self.geometry是不是应该是你定义的planeGeometry呀?不然可能会把当前节点的geometry传给新节点,不是你想要的SCNBox哦~
内容的提问来源于stack exchange,提问作者Math_Enthusiast
相关产品推荐
相关产品推荐

