SceneKit的autoenablesDefaultLighting属性失效,如何关闭默认光照?
解决SceneKit关闭默认光照后物体仍可见的问题
你遇到的这个情况我之前也碰到过——就算把autoenablesDefaultLighting设为false,物体还是不会变成纯黑色,这是因为SceneKit的场景默认自带了环境光(ambient lighting),这个默认的环境光会让物体显示出基础颜色,哪怕没有其他光源。
要实现“无光照时所有物体都显示为黑色”的效果,你需要做这几步:
- 保持
autoenablesDefaultLighting = false的设置,确保不会自动添加默认光源 - 关闭场景的默认环境光,让场景完全没有任何光照来源
- 确保场景中没有手动添加的其他光源
下面是修改后的代码,你可以直接替换测试:
import SceneKit import QuartzCore class GameViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() let scnView = SCNView(frame: NSRect(x: 0, y: 0, width: 450, height: 300)) view.addSubview(scnView) // 关闭自动默认光照 scnView.autoenablesDefaultLighting = false scnView.allowsCameraControl = true scnView.backgroundColor = NSColor.blue let scene = SCNScene() // 关键:关闭场景的环境光照,设置为纯黑色 scene.background.contents = NSColor.black scene.lightingEnvironment.contents = NSColor.black scnView.scene = scene let sphereGeo = SCNSphere(radius: 2) sphereGeo.segmentCount = 4 sphereGeo.materials.first?.diffuse.contents = NSColor.lightGray let sphereNode = SCNNode(geometry: sphereGeo) sphereNode.name = "Sphere Node" scene.rootNode.addChildNode(sphereNode) } }
代码修改说明:
scene.background.contents = NSColor.black:不仅设置背景为黑色,还会消除默认环境光的基础亮度scene.lightingEnvironment.contents = NSColor.black:完全禁用场景的环境光照,这是让物体在无光源时变黑的核心步骤- 保留你原来的
autoenablesDefaultLighting = false,确保不会自动生成默认方向光
现在运行代码,你会看到球体完全变成黑色(和蓝色背景形成对比的话,其实是看不到球体的),如果想要验证效果,你可以临时添加一个方向光:
let lightNode = SCNNode() lightNode.light = SCNLight() lightNode.light?.type = .directional lightNode.position = SCNVector3(x: 5, y: 5, z: 5) scene.rootNode.addChildNode(lightNode)
添加后球体就会重新显示出浅灰色,说明无光照时的黑色效果生效了。
内容的提问来源于stack exchange,提问作者dàhóngpáo
相关产品推荐
相关产品推荐

