是否有可能有一个SCNNode是透明的,但它隐藏了它后面的任何对象?

时间:2017-09-01 18:39:09

标签: ios scenekit arkit scnnode occlusion

所以要明确我的目标,因为我没有任何代码可以分享...让我说我有一个位于相机和另一个SCNNode之间的SCNNode。第一个SCNNode是SCNBox,但没有纹理,因此可以在它后面看到第二个SCNNode。我想给第一个节点一个透明材质,但要让它遮挡它后面的所有节点,好像它是不透明的。在常规场景中,这意味着您可以看到场景背景颜色,也许是黑色,但我计划在ARKit中执行此操作,这更有意义,因为这意味着您只需看到现实世界背后。

2 个答案:

答案 0 :(得分:1)

您可以使用颜色鲜明的材料:

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]

答案 1 :(得分:-1)

我已经从评论中测试了我的想法,它似乎有效,但并不完美,但我会在这一点上进行扩展。

为了支持渲染过程,SceneKit只使用深度缓冲区并渲染一个点,如果它位于所述缓冲区中保存的内容之前,那么我们必须告诉SceneKit先渲染透视立方体然后再渲染所有其他节点,所以将多维数据集节点renderingOrder属性保留为0(默认值),然后将所有其他节点renderingOrder设置为更高的值,即1,{{1}通常对于透明对象,您不想写入深度缓冲区,因此您可以看到后面的对象,但事实并非如此,因此请将多维数据集材质10属性保留为writeToDepthBuffer(默认情况下)值)。最后要做的是让你的立方体透明,你可以使用默认材料,然后添加

true

正如我之前所说,这种方法并不完美,而且感觉更像是一种解决方法......但它确实有效。我们没有将透明度设置为cube.geometry?.firstMaterial?.transparency = 0.00000001 的原因是,如果我们这样做就像立方体不存在那样,那么完全透明的像素就不会保存到深度缓冲区。