【问题标题】:Is it possible to have a SCNNode which is transparent, but which occludes any object behind it? [duplicate]是否有可能有一个透明的 SCNNode,但它会遮挡它后面的任何对象? [复制]
【发布时间】:2018-02-10 20:57:07
【问题描述】:

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

【问题讨论】:

  • 只是一个想法,未测试:对于前面的框,使材质透明并将writesToDepthBuffer留给true,然后设置每个节点renderingOrder,以便渲染前面的框首先 (0),然后是其他节点(1 或更大的值)

标签: ios scenekit arkit scnnode occlusion


【解决方案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]

【讨论】:

    【解决方案2】:

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

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

    cube.geometry?.firstMaterial?.transparency = 0.00000001
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多