使用ARKit与RealityKit时如何启用.showSceneUnderstanding显示LiDAR网格指引
问题原因
你用的是ARSCNView(SceneKit的AR视图),但.showSceneUnderstanding是RealityKit的ARView专属调试选项,ARSCNView并没有这个枚举值,直接调用自然会报错。
解决方案
根据你当前使用的框架,分两种场景处理:
场景1:继续用SceneKit(ARSCNView)
如果要在ARSCNView里显示场景重建的Mesh,得手动获取ARMeshAnchor并创建对应的SCNNode添加到场景中,步骤如下:
- 确保配置已开启场景重建(你代码里已经加了,这步没问题):
worldtracking.sceneReconstruction = .meshWithClassification
- 实现ARSessionDelegate的锚点添加方法,生成Mesh节点:
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { guard let meshAnchors = anchors as? [ARMeshAnchor] else { return } for meshAnchor in meshAnchors { // 从Mesh锚点数据创建SCN几何 let meshGeometry = SCNGeometry(meshAnchor: meshAnchor) // 设置Mesh的显示样式(比如半透明线框) let meshNode = SCNNode(geometry: meshGeometry) meshNode.name = "mesh_\(meshAnchor.identifier)" meshNode.geometry?.firstMaterial?.fillMode = .lines meshNode.geometry?.firstMaterial?.transparency = 0.5 meshNode.geometry?.firstMaterial?.diffuse.contents = UIColor.blue // 添加到场景根节点 sceneView.scene.rootNode.addChildNode(meshNode) } }
- 补充锚点更新方法,实时刷新Mesh形状:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { guard let meshAnchors = anchors as? [ARMeshAnchor] else { return } for meshAnchor in meshAnchors { // 找到对应节点并更新几何数据 guard let meshNode = sceneView.scene.rootNode.childNodes.first(where: { $0.name == "mesh_\(meshAnchor.identifier)" }) else { return } meshNode.geometry = SCNGeometry(meshAnchor: meshAnchor) } }
场景2:切换到RealityKit(ARView)
如果愿意改用RealityKit的ARView,就能直接用.showSceneUnderstanding快速显示Mesh,步骤更简单:
- 把视图替换为
ARView(可以在Storyboard里设置类为ARView,或者代码创建):
@IBOutlet var arView: ARView!
- 配置会话后直接开启调试选项:
let config = ARWorldTrackingConfiguration() config.sceneReconstruction = .meshWithClassification arView.session.run(config) arView.debugOptions.insert(.showSceneUnderstanding)
额外注意事项
- 场景重建仅支持A12及以上芯片的设备(比如iPhone XS及之后的机型)
- 测试时需要在有足够视觉特征的真实环境中,ARKit才能正常重建Mesh
内容的提问来源于stack exchange,提问作者Varun
相关产品推荐
相关产品推荐

