swift SceneKit -取决于相机Angular 的平行光阴影

ccgok5k5  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(149)

这个问题会让大家困惑:在我的项目中,一艘宇宙飞船正飞过一片风景。它投射出一个阴影(正下方),这是通过使用定向光创建的,所以它的大小不会随着船的高度而改变。我试了很多次,试图完全正确,有时它能工作,有时它不能。我有一个移动的相机,这意味着船的Angular 会根据它飞行的Angular 而变化。
现在我发现了为什么影子并不总是以它应该的方式工作:低于某个视角(水平视角越多),阴影将变得像素化,然后 Flink ,直到相机完全水平时阴影完全消失。

随着视野越来越向下,船的阴影将变得越来越清晰,在大约30°的上方,它刚刚好。
我已经在Stack Overflow中检查过了,但是看起来一个可变Angular 的摄像头是相当不寻常的。我猜一个固定在玩家节点上方的摄像头更常见。
有人知道这个行为吗?这是我的代码。

self.dirLightNode = SCNNode()
self.dirLightNode.light = SCNLight()
self.dirLightNode.position = SCNVector3(x: -0 * dividerx, 
                                        y: 20 * dividery, 
                                        z: -00)
self.dirLightNode.light?.type = .directional
self.dirLightNode.light!.color = UIColor.black
self.dirLightNode.light?.castsShadow = true
self.dirLightNode.light?.shadowMode = .deferred
self.dirLightNode.light?.categoryBitMask = 1
self.dirLightNode.light?.shadowColor = UIColor.black.withAlphaComponent(0.8)
self.dirLightNode.rotation = SCNVector4Make(1,0,0, 1.5 * Float.pi)
self.dirLightNode.light?.orthographicScale = 10
self.dirLightNode.light?.shadowRadius = 10
self.dirLightNode.light?.shadowBias = 1
self.dirLightNode.light?.zFar = 100
self.dirLightNode.light?.zNear = 0
self.dirLightNode.light?.maximumShadowDistance = 10000
self.dirLightNode.light?.shadowSampleCount = 1
self.dirLightNode.light?.shadowMapSize = CGSize(width: 4096, height: 4096)

我试着改变了shadowradius,shadowBias,samplecount,automaticshadowprojection,等等。似乎没有什么能解决这个问题。有人知道一个参考资料,在那里所有的参数都被解释得很透彻吗?

holgip5t

holgip5t1#

若要渲染SceneKit的“深度贴图”(也称为投影)阴影而不出现瑕疵,请使用以下值。

.shadowBias

shadowBias***属性指定要应用于阴影贴图的校正,以校正***痤疮伪影(或面向光线的表面上所谓的阴影条带伪影)。将其乘以特定于实现的值以创建恒定的深度偏移。尝试increasedecrease此值。

.shadowMapSize

阴影贴图越大,阴影就越精确,但计算速度越慢。如果设置为(0,0),阴影贴图的大小将自动选择。因此,最好尝试默认值。

.shadowSampleCount

在iOS 10.0及更高版本或macOS 10.12及更高版本上,当shadowSampleCount设置为0时,将根据平台选择默认样本计数。

self.dirLightNode.light?.shadowMapSize = CGSizeZero         // default
self.dirLightNode.light?.shadowRadius = 3.0                 // default

self.dirLightNode.light?.shadowBias = 0.1               
self.dirLightNode.light?.shadowSampleCount = 0
wbgh16ku

wbgh16ku2#

好吧,很难说,你的项目有什么问题。这是我的配置,我如何设置灯光(在这种情况下是定向灯)。给予看,让我知道,如果它以任何方式帮助你。

static func getSceneLight() -> SCNLight {
    
    let light = SCNLight()
    
    // Light Config
    light.type                                 = .directional
    light.color                                = UIColor.white
    light.shadowMode                           = .forward
    light.castsShadow                          = true
    light.categoryBitMask                      = -1 // Shine on Everything
    light.shadowCascadeCount                   = 4  // Important for good Shadows
    light.automaticallyAdjustsShadowProjection = true // NEW, good for sharp shadows
    
    print("Scene Light requested.")
    
    // Not Configured
    // light.shadowCascadeSplittingFactor         = 0.1  // DO NOT SET!!!
    // light.shadowRadius                         = 2.0  // 3.25 // suggestion by StackOverflow
    // light.shadowCascadeCount                   = 3    // suggestion by StackOverflow
    // light.shadowCascadeSplittingFactor         = 0.09 // suggestion by StackOverflow
    // light.shadowBias                           = 2.0  // 0.1 // (in testing)
    // light.parallaxCorrectionEnabled            = true // what is this
    // light.shadowSampleCount                    = 1.0  // DO NOT SET!!!
    // light.zNear                                = 0.1
    // light.zFar                                 = 1000000.0
    // light.orthographicScale                    = 1.0
    
    return light
    
}

正如你所看到的,有许多选项未配置。我没有运气使用它们。我希望,我可以帮助你。
PS:通常我使用1000.0的强度值,并添加相同颜色和强度为250.0的环境光(我在后期配置中这样做)

相关问题