SceneKit中添加到默认相机的子节点未跟随相机移动如何解决
问题原因
- 当
SCNView的allowsCameraControl属性设置为true时,系统会自动生成一个SCNCameraController实例接管所有触摸交互的视角控制逻辑。如果没有提前手动给scnView.pointOfView赋值自定义的相机节点,系统会在首次触发交互时动态替换pointOfView的指向,改为控制器内部生成的相机节点。你之前添加平面的旧相机节点已经不在场景的活跃节点树中,平面自然不会跟随交互更新位置。 - 另一种高频触发场景是在
viewDidLoad等视图未完全初始化的生命周期阶段执行添加子节点操作,此时scnView.pointOfView还未完成初始化,取值为nil,addChildNode操作实际上没有执行,平面默认被添加到了场景根节点上,固定在世界坐标的初始位置,不会跟随相机移动。
验证方式
在用户触发交互后打印当前 scnView.pointOfView 的内存地址,和你添加平面时保存的相机节点内存地址做对比,就能确认两者是否为同一个对象;同时打印 plane.parent 的地址,可以直接确认平面的父节点是否为当前生效的相机节点。
修复方案
- 优先选择手动创建自定义相机节点,赋值给
scnView.pointOfView后再开启交互控制,最后添加平面到自定义相机节点下:
// 初始化自定义相机节点 let customCameraNode = SCNNode() customCameraNode.camera = SCNCamera() scnView.pointOfView = customCameraNode // 开启相机交互控制 scnView.allowsCameraControl = true // 添加平面到相机节点 customCameraNode.addChildNode(plane) plane.position = SCNVector3(x: 0, y: 0, z: -5)
- 如果不需要自定义相机,可以把添加平面的逻辑放到
viewDidAppear等视图完全加载完成的生命周期阶段执行,确保此时scnView.pointOfView已经是控制器最终使用的相机节点。
内容的提问来源于stack exchange,提问作者user9775960
相关产品推荐
相关产品推荐

