【问题标题】:Issue with adding shadow to a SCNPlane with clear background向具有清晰背景的 SCNPlane 添加阴影的问题
【发布时间】:2020-08-23 21:02:17
【问题描述】:

我正在尝试在SCNPlane 上添加阴影,一切正常,但我无法使 SCNPlane 透明以仅显示阴影而不显示白色背景。这是代码:

        let flourPlane = SCNPlane()
        let groundPlane = SCNNode()


        let clearMaterial = SCNMaterial()
        clearMaterial.lightingModel = .constant
        //clearMaterial.colorBufferWriteMask = []
        clearMaterial.writesToDepthBuffer = true
        clearMaterial.transparencyMode = .default

        flourPlane.materials = [clearMaterial]

        groundPlane.scale = SCNVector3(200, 200, 200)
        groundPlane.geometry = flourPlane
        groundPlane.castsShadow = false
        groundPlane.eulerAngles = SCNVector3Make(-Float.pi/2, 0, 0)
        groundPlane.position = SCNVector3(x: 0.0, y: shadowY, z: 0.0)
        node.addChildNode(groundPlane)

        // Create a ambient light
        let ambientLight = SCNNode()
        ambientLight.light = SCNLight()
        ambientLight.light?.shadowMode = .deferred
        ambientLight.light?.color = UIColor.white
        ambientLight.light?.type = SCNLight.LightType.ambient
        ambientLight.position = SCNVector3(x: 0,y: 5,z: 0)

        // Create a directional light node with shadow
         let myNode = SCNNode()
        myNode.light = SCNLight()
        myNode.light?.type = .directional
        myNode.light?.castsShadow = true
        myNode.light?.automaticallyAdjustsShadowProjection = true
        myNode.light?.shadowSampleCount = 80
        myNode.light?.shadowBias = 1
        myNode.light?.orthographicScale = 1
        myNode.light?.shadowMode = .deferred
        myNode.light?.shadowMapSize = CGSize(width: 2048, height: 2048)
        myNode.light?.shadowColor = UIColor.black.withAlphaComponent(0.5)
        myNode.light?.shadowRadius = 10.0
        myNode.eulerAngles = SCNVector3Make(-Float.pi/2, 0, 0)
        node.addChildNode(ambientLight)
        node.addChildNode(myNode)

当我添加clearMaterial.colorBufferWriteMask = [] 时阴影消失了!如何创建透明材质以仅显示阴影。

白色区域为SCNPlane,红色为背景。

【问题讨论】:

  • @Asperi 它不需要那样成像!我只需要一个没有背景颜色的 SCNPlane。

标签: ios swift scenekit scnnode


【解决方案1】:

您可以将材质“颜色”设置为 .clear,如下所示:

extension SCNMaterial {
convenience init(color: UIColor) {
    self.init()
    diffuse.contents = color
}
convenience init(image: UIImage) {
    self.init()
    diffuse.contents = image
}
}

let clearColor = SCNMaterial(color: .clear)
flourPlane.materials = [clearColor]

【讨论】:

  • @Mc.Lover 什么没用?你的飞机没有变透明?
【解决方案2】:

我在another SO answer中发现了一个窍门。

调整地板的blendMode 以改变其像素与底层像素的组合方式。

let clearMaterial = SCNMaterial()
// alter how pixels affect underlying pixels
clearMaterial.blendMode = .multiply
// use the simplest shading that shows a shadow (so not .constant!)
clearMaterial.lightingModel = .lambert
// unobstructed parts are render pure white and thus have no effect
clearMaterial.diffuse.contents = UIColor.white

floorPlane.firstMaterial = clearMaterial

您可以在这张图片中看到效果。主平面是不可见的,但阴影是可见的。立方体、它的阴影和球栅具有相同的 XZ 位置。请注意“阴影”如何影响底层几何图形和场景背景。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 2012-06-25
    • 2012-10-07
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多