代码之家  ›  专栏  ›  技术社区  ›  Damian Dudycz

从远处投射阴影

  •  1
  • Damian Dudycz  · 技术社区  · 6 年前

    我有一个 AR 我从用户那里计算出当前太阳位置的应用程序。我把这个位置缩小到 10,000 meters ,所以当我在场景中移动时它会“保持”在原位。现在我想把这个节点的阴影投射到场景中的其他节点上。我试过几种类型的闪电,但没有一种成功。有些人根本就没有影子,有些人行为怪异。从如此遥远的节点创建光源,在看不见的节点上投射阴影的最佳方法是什么 floor node ? 我应该补充一下吗 ambient 现场有灯光吗?它可以添加到摄影机节点,还是应该在其他地方?

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

    使用 directional ambient 用于模拟伪次光线的灯光(如果不使用全局照明)。

    // DIRECTIONAL LIGHT for `primary light rays` simulation
    let lightNode = SCNNode()
    lightNode.light = SCNLight()
    lightNode.light!.type = .directional
    lightNode.light!.castsShadow = true
    lightNode.light!.shadowMode = .deferred
    lightNode.light!.categoryBitMask = -1
    lightNode.light!.automaticallyAdjustsShadowProjection = true
    //lightNode.light!.maximumShadowDistance = 11000
    lightNode.position = SCNVector3(x: 0, y: -5000, z: 0)
    lightNode.rotation = SCNVector4(x: -1, y: 0, z: 0, w: .pi/2)
    scene.rootNode.addChildNode(lightNode)
    

    小费 :的位置 定向 y:-5000 ),最重要的是 方向 属于 轻点!

    阿尔索 定向 光没有颜色 falloff 或者,所谓的, quadratic light decay .

    // AMBIENT LIGHT for `fake secondary light rays` simulation
    let ambientLightNode = SCNNode()
    ambientLightNode.light = SCNLight()
    ambientLightNode.light!.type = .ambient
    ambientLightNode.light!.intensity = 1000
    ambientLightNode.light!.color = NSColor.white
    scene.rootNode.addChildNode(ambientLightNode)
    

    不要错误地使用此布尔值:

    lightNode.castsShadow = true
    

    而不是这个:

    lightNode.light!.castsShadow = true
    

    布尔值 lightNode.castsShadow 确定SceneKit是否将节点内容渲染为阴影贴图。

    定向

    enter image description here

    有时,如果你在相机上加一盏灯,你会得到一些好处。在这种情况下,法线与光线平行的对象曲面将被照亮。