可以清楚地了解我的目标,因为我没有任何代码可以共享...可以说我有一个位于相机和另一个scnnode之间的scnnode。第一个scnnode是一个scnbox,但没有纹理,因此可以看到第二个scnnode。我想给第一个节点一种透明的材料,但要把它遮住它背后的所有节点,好像它是不透明的。在常规场景中,这意味着您可能会看到场景背景颜色,也许是黑色,但是我计划在Arkit中这样做,这更有意义,因为这意味着您只会看到它背后的现实世界。/p>
您可以使用带有透明颜色的材料:
extension SCNMaterial {
convenience init(color: UIColor) {
self.init()
diffuse.contents = color
}
convenience init(image: UIImage) {
self.init()
diffuse.contents = image
}
}
let clearMaterial = SCNMaterial(color: .clear)
boxNode.materials = [clearMaterial]
我已经从评论中测试了我的想法,它似乎有效,不是完美,但我会在以后扩展。
支持渲染过程SceneKit使用深度缓冲区并仅在将其保存在所述缓冲区中的内容的前面时才能渲染,因此我们必须告诉Scenekit首先呈现您的透明立方体,因此,将您的立方体节点renderingOrder
属性保留到0
(默认值),然后将所有其他节点renderingOrder
设置为较高的值,即1
,CC_4,10
...通常对于透明对象,您不想写入深度缓冲区,您可以看到后面的对象,但事实并非如此,因此将您的立方体材料 writeToDepthBuffer
属性保留到 true
(默认值)。最后要做的是使您的立方体透明,您可以使用默认材料,然后添加
cube.geometry?.firstMaterial?.transparency = 0.00000001
正如我在这种方法之前所说的那样,它并不完美,感觉更像是解决方法……但它起作用。我们之所以不设置透明度的透明度的原因是,如果我们这样做就像Cube甚至不存在,那是完全透明的像素,并不能保存到深度缓冲区。