6

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

4

2 回答 2

3

您可以使用颜色清晰的材料:

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]
于 2017-09-01T20:25:51.943 回答
-3

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

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

cube.geometry?.firstMaterial?.transparency = 0.00000001

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

于 2017-09-01T19:29:50.947 回答