代码之家  ›  专栏  ›  技术社区  ›  Jun

我可以用scenekit和arkit制作可以透过透明物体的阴影吗?

  •  5
  • Jun  · 技术社区  · 8 年前

    我用scenekit制作了透明的物体,并与arkit链接。 我用lightning材质制作了一个阴影,但透过透明物体看不到阴影。 我做了一个平面,把物体放在上面。 并将光照射到透明物体上。 阴影出现在物体后面,但无法穿透物体。

    enter image description here

    下面是生成阴影的代码。

              let light = SCNLight()
              light.type = .directional
              light.castsShadow = true
              light.shadowRadius = 200
              light.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3)
              light.shadowMode = .deferred
              let constraint = SCNLookAtConstraint(target: model)
              lightNode = SCNNode()
              lightNode!.light = light
              lightNode!.position = SCNVector3(model.position.x + 10, model.position.y + 30, model.position.z+30)
              lightNode!.eulerAngles = SCNVector3(45.0, 0, 0)
              lightNode!.constraints = [constraint]
              sceneView.scene.rootNode.addChildNode(lightNode!)
    

    下面的代码是用来在瓶子下面做地板的。

     let floor = SCNFloor()
     floor.reflectivity = 0
     let material = SCNMaterial()
     material.diffuse.contents = UIColor.white
     material.colorBufferWriteMask = SCNColorMask(rawValue:0)
     floor.materials = [material]
     self.floorNode = SCNNode(geometry: floor)
     self.floorNode!.position = SCNVector3(x, y, z)
     self.sceneView.scene.rootNode.addChildNode(self.floorNode!)
    

    我认为它可以用简单的属性来解决,但我不明白。

    我怎样才能解决这个问题?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Xartec    8 年前

    延迟着色的一个已知问题是,它不适用于透明度,因此您可能必须删除该线,然后再次使用默认的正向着色。也就是说,你正在寻找的简单属性是。SCNNode上的renderingOrder属性。例如,将其设置为99。通常情况下,渲染顺序并不重要,因为z缓冲区用于确定哪些像素在其他像素之前。要使阴影通过对象的透明部分显示,需要确保最后渲染对象。

    enter image description here

    另一方面,假设您使用了我在另一个问题上发布的一些材质设置,请尝试将光泽度值设置为0.4。

    请注意,这仍然会创建一个阴影,就像对象根本不透明一样,因此它不会为标签和封口创建较暗的阴影。为了获得额外的真实感,您可以选择完全假造阴影,例如使用阴影纹理,并将其放置在需要时旋转和倾斜的平面上。为了获得更真实的效果,你也可以用这种方式来模拟焦散。

    推荐文章