代码之家  ›  专栏  ›  技术社区  ›  Semyon Tikhonenko

SceneKit。如何在不启用autoenablesDefaultLighting的情况下实现默认场景灯光行为?

  •  0
  • Semyon Tikhonenko  · 技术社区  · 2 年前

    我试着设置 autoenablesDefaultLighting=true 我的SCNView,它看起来不错。然而,我想在没有 autoenablesDefaultLighting 设置灯,并稍微调整一下。

    我用这个代码尝试了omni light:

    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light?.castsShadow = true
    lightNode.light?.type = .omni
    lightNode.light?.intensity = 10000
    lightNode.position = SCNVector3(x: 0, y: 0, z: 100)
    scene.rootNode.addChildNode(lightNode)
    

    得到了这个:

    enter image description here

    autoenablesDefaultLighting=true 我得到了这个:

    enter image description here

    0 回复  |  直到 2 年前
        1
  •  0
  •   Andy Jazz    2 年前

    自定义默认照明

    我相信,在SceneKit中,默认场景照明是一个没有任何阴影的平行光,直接附加到默认摄影机节点(即。 pointOfView 节点)。模拟与 .autoenablesDefaultLighting 属性为 true ,请使用以下代码:

    enter image description here

    代理的渲染器方法:

    import SceneKit
    
    extension GameViewController: SCNSceneRendererDelegate {
        
        func renderer(_ renderer: SCNSceneRenderer,
               updateAtTime time: TimeInterval) {
            
            sunNode.transform = (sceneView?.pointOfView?.worldTransform)!
            
            let cameraAngles = (self.sceneView?.pointOfView?.eulerAngles)!
            let lightAngles = self.sunNode.eulerAngles
            
            print("Camera: " + String(format: "%.2f, %.2f, %.2f", cameraAngles.x,
                                                                  cameraAngles.y,
                                                                  cameraAngles.z))
    
            print("Light: " + String(format: "%.2f, %.2f, %.2f", lightAngles.x,
                                                                 lightAngles.y,
                                                                 lightAngles.z))
        }
    }
    

    以下是GameViewController类:

    class GameViewController: NSViewController {
        
        var sceneView: SCNView? = nil
        let sunNode = SCNNode()
        
        override func viewDidLoad() {
            super.viewDidLoad()
           
            sceneView = self.view as? SCNView
            sceneView?.delegate = self
            let scene = SCNScene(named: "ship.scn")!
            sceneView?.scene = scene
            
            sceneView?.scene?.lightingEnvironment.contents = .none
            sceneView?.scene?.background.contents = .none
            
            sceneView?.backgroundColor = .black
            sceneView?.allowsCameraControl = true
            // sceneView?.autoenablesDefaultLighting = true
            
            sunNode.light = SCNLight()
            sunNode.light?.type = .directional
            sceneView?.scene?.rootNode.addChildNode(sunNode)
        }
    }
    

    第页。

    我想补充一点,如果场景中根本没有灯光(包括 autoenablesDefaultLighting 参数),则场景中唯一不可控的光源将是不可切换的环境光。

    除上述内容外,“基于物理”着色器始终需要额外的照明(否则,基于物理的曲面将为黑色)。

    如果“平行光”垂直照射曲面,则曲面将以100%的强度(默认强度为1000流明)进行照射,但如果光源的光线平行于曲面,则该光源不会照射曲面。

    enter image description here

    enter image description here

    enter image description here

    正如您所看到的,第一个和第三个图像是相同的。