You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:43:08