Возможно ли иметь SCNNode, который является прозрачным, но который загораживает любой объект за ним?

Итак, чтобы прояснить мои цели, поскольку у меня нет кода, которым я мог бы поделиться... Допустим, у меня есть узел SCNN, который расположен между камерой и другим узлом SCNN. Первый SCNNode представляет собой SCNBox, но не имеет текстуры, поэтому за ним виден второй SCNNode. Я хочу дать первому узлу прозрачный материал, но чтобы он также закрывал все узлы за ним, как если бы он был непрозрачным. В обычной сцене это означало бы, что вы могли бы видеть цвет фона сцены, возможно, черный, но я планирую сделать это в ARKit, что имеет больше смысла, поскольку это означает, что вы просто увидите реальный мир за ним.


person Andrew    schedule 01.09.2017    source источник
comment
Просто идея, не проверенная: для блока спереди сделайте материал прозрачным и оставьте writesToDepthBuffer до true, затем настройте каждый узел renderingOrder так, чтобы блок впереди отображался первым (0), а затем другие узлы (1 или больше). ценность)   -  person Marco Boschi    schedule 01.09.2017


Ответы (2)


Вы можете использовать материал с прозрачным цветом:

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]
person Vasilii Muravev    schedule 01.09.2017

Я проверил свою идею из комментариев, и, похоже, она работает, но не идеально, но позже я расширю этот момент.

Для поддержки процесса рендеринга SceneKit использует буфер глубины и визуализирует точку только в том случае, если она будет находиться перед тем, что сохранено в указанном буфере, поэтому мы должны указать SceneKit сначала визуализировать ваш прозрачный куб, а затем все остальные узлы, поэтому оставьте свойство вашего узла куба renderingOrder равно 0 (значение по умолчанию), затем установите для всех остальных узлов renderingOrder более высокое значение, т. е. 1, 10... Обычно для прозрачных объектов вы не хотите записывать в буфер глубины, чтобы вы могли видеть объекты позади, но это не так, поэтому оставьте свойство writeToDepthBuffer материала куба равным true (значение по умолчанию). Последнее, что нужно сделать, это сделать ваш куб прозрачным, вы можете использовать материал по умолчанию, а затем добавить

cube.geometry?.firstMaterial?.transparency = 0.00000001

Как я уже говорил, этот метод не идеален и кажется скорее обходным путем... но он работает. Причина, по которой мы не устанавливаем прозрачность ровно 0, заключается в том, что если мы это сделаем, куба даже не будет, то есть полностью прозрачные пиксели не будут сохранены в буфере глубины.

person Marco Boschi    schedule 01.09.2017