我可以使用 scenekit 和 arkit 制作可以透过透明物体看到的阴影吗?
Can I make shadow that can look through transparent object with scenekit and arkit?
我用 scenekit 制作了透明物体并与 arkit 链接。
我用闪电material做了一个阴影,但是透过透明物体看不到阴影。
我制作了一架飞机并将物体放在上面。
并将光照射到透明物体上。
影子出现在物体后面但看不透物体
这是制作阴影的代码。
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!)
我认为可以用简单的方法解决属性,但我想不通。
我该如何解决这个问题?
延迟着色的一个已知问题是它不适用于透明度,因此您可能必须删除该行并再次使用默认的前向着色。也就是说,您正在寻找的“简单 属性”是 SCNNode 上的 .renderingOrder 属性。例如,将其设置为 99。通常渲染顺序无关紧要,因为 z 缓冲区用于确定哪个像素在其他像素前面。要使阴影透过对象的透明部分显示出来,您需要确保最后渲染对象。
另一方面,假设您使用了我在您的其他问题中发布的某些 material 设置,请尝试将光泽度值设置为 0.4 之类的值。
请注意,这仍会产生阴影,就好像对象根本不透明一样,因此不会为标签和盖子产生更暗的阴影。为了获得额外的真实感,您可以选择完全伪造阴影,就像使用阴影纹理并将其放在您根据需要旋转和倾斜的平面上一样。为了更加真实,您也可以用这种方式伪造焦散。
您可能还想为 material 的反射 属性 添加反射贴图。几乎与纹理贴图相同,但为灰度,其中标签和盖子为深灰色(反光性不强),玻璃部分为浅灰色(否则标签看起来像是在玻璃内部)。最后提示:使用 Shell 修饰符(无论如何在 3Ds max 中都是这样称呼的)为玻璃模型提供一些厚度。
我用 scenekit 制作了透明物体并与 arkit 链接。 我用闪电material做了一个阴影,但是透过透明物体看不到阴影。 我制作了一架飞机并将物体放在上面。 并将光照射到透明物体上。 影子出现在物体后面但看不透物体
这是制作阴影的代码。
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!)
我认为可以用简单的方法解决属性,但我想不通。
我该如何解决这个问题?
延迟着色的一个已知问题是它不适用于透明度,因此您可能必须删除该行并再次使用默认的前向着色。也就是说,您正在寻找的“简单 属性”是 SCNNode 上的 .renderingOrder 属性。例如,将其设置为 99。通常渲染顺序无关紧要,因为 z 缓冲区用于确定哪个像素在其他像素前面。要使阴影透过对象的透明部分显示出来,您需要确保最后渲染对象。
另一方面,假设您使用了我在您的其他问题中发布的某些 material 设置,请尝试将光泽度值设置为 0.4 之类的值。
请注意,这仍会产生阴影,就好像对象根本不透明一样,因此不会为标签和盖子产生更暗的阴影。为了获得额外的真实感,您可以选择完全伪造阴影,就像使用阴影纹理并将其放在您根据需要旋转和倾斜的平面上一样。为了更加真实,您也可以用这种方式伪造焦散。
您可能还想为 material 的反射 属性 添加反射贴图。几乎与纹理贴图相同,但为灰度,其中标签和盖子为深灰色(反光性不强),玻璃部分为浅灰色(否则标签看起来像是在玻璃内部)。最后提示:使用 Shell 修饰符(无论如何在 3Ds max 中都是这样称呼的)为玻璃模型提供一些厚度。