【问题标题】:Can I make shadow that can look through transparent object with scenekit and arkit?我可以用scenekit和arkit制作可以透过透明物体的阴影吗?
【发布时间】:2018-03-28 00:50:16
【问题描述】:

我用scenekit制作了透明物体并与arkit链接。 我用闪电材质制作了一个阴影,但透过透明物体看不到阴影。 我做了一架飞机并将物体放在上面。 并将光照射到透明物体上。 阴影出现在物体后面,但看不到物体。

这是制作阴影的代码。

          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!)

我认为可以用简单的属性来解决,但我想不通。

我该如何解决这个问题?

【问题讨论】:

  • 相关节点中是否有“Alpha”设置(您希望使其透明)?如果是这样,请将其更改为“0.5”以使 50% 透明。
  • 当然它有透明的alpha值(可能是0.2)。但是虽然它有 alpha,但通过透明物体是看不到阴影的。

标签: ios swift scenekit arkit


【解决方案1】:

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

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

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

您可能还想为材质的反射属性添加反射贴图。与纹理贴图几乎相同,但为灰度,其中标签和瓶盖为深灰色(不是很反光),玻璃部分为浅灰色(否则看起来标签在玻璃内部)。最后一个提示:使用壳修改器(这就是它在 3Ds max 中的名称)给玻璃模型一些厚度。

【讨论】:

  • 当我将阴影模式更改为前进时,阴影消失了。当我删除地板材质中的 colorWriteMask 属性时,我可以通过瓶子看到阴影,但看不到真实环境。我发布了制作地板的代码。总之非常感谢! @Xartec。我想听听你的解决方案。
  • 您是否尝试将renderingOrder=99 与.deferred 着色相结合? (只是为了确认它不起作用)。
  • 是的,我做到了,但在这种情况下无法透过物体看到阴影。我认为更改应该在 scnfloor 中。
  • 我同意,我认为您将不得不使用不同的方式来混合地板。但是,如果另一个简单的属性发生变化,我认为这不是问题。使用延迟着色,阴影是在后期处理中添加的,而不是在绘制透明对象时添加的。使用前向着色和颜色位掩码,它首先丢弃地板的像素,并且没有任何东西可以在上面绘制阴影。
  • 我认为您可能必须走 SCNTechnique 路线并自己渲染多个通道。例如在单独的通道中绘制启用 castshadow 且不透明度几乎为零的节点副本(0.01 将几乎隐藏节点,但仍投射完整阴影)。然后以完全不透明且没有投射阴影的对象渲染另一个通道。
猜你喜欢
  • 2018-01-12
  • 2015-09-07
  • 2019-03-10
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2023-03-10
相关资源
最近更新 更多