Итак, чтобы прояснить мои цели, поскольку у меня нет кода, которым я мог бы поделиться... Допустим, у меня есть узел SCNN, который расположен между камерой и другим узлом SCNN. Первый SCNNode представляет собой SCNBox, но не имеет текстуры, поэтому за ним виден второй SCNNode. Я хочу дать первому узлу прозрачный материал, но чтобы он также закрывал все узлы за ним, как если бы он был непрозрачным. В обычной сцене это означало бы, что вы могли бы видеть цвет фона сцены, возможно, черный, но я планирую сделать это в ARKit, что имеет больше смысла, поскольку это означает, что вы просто увидите реальный мир за ним.
Возможно ли иметь SCNNode, который является прозрачным, но который загораживает любой объект за ним?
Ответы (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]
Я проверил свою идею из комментариев, и, похоже, она работает, но не идеально, но позже я расширю этот момент.
Для поддержки процесса рендеринга SceneKit использует буфер глубины и визуализирует точку только в том случае, если она будет находиться перед тем, что сохранено в указанном буфере, поэтому мы должны указать SceneKit сначала визуализировать ваш прозрачный куб, а затем все остальные узлы, поэтому оставьте свойство вашего узла куба renderingOrder
равно 0
(значение по умолчанию), затем установите для всех остальных узлов renderingOrder
более высокое значение, т. е. 1
, 10
... Обычно для прозрачных объектов вы не хотите записывать в буфер глубины, чтобы вы могли видеть объекты позади, но это не так, поэтому оставьте свойство writeToDepthBuffer
материала куба равным true
(значение по умолчанию). Последнее, что нужно сделать, это сделать ваш куб прозрачным, вы можете использовать материал по умолчанию, а затем добавить
cube.geometry?.firstMaterial?.transparency = 0.00000001
Как я уже говорил, этот метод не идеален и кажется скорее обходным путем... но он работает. Причина, по которой мы не устанавливаем прозрачность ровно 0
, заключается в том, что если мы это сделаем, куба даже не будет, то есть полностью прозрачные пиксели не будут сохранены в буфере глубины.
writesToDepthBuffer
доtrue
, затем настройте каждый узелrenderingOrder
так, чтобы блок впереди отображался первым (0), а затем другие узлы (1 или больше). ценность) - person Marco Boschi   schedule 01.09.2017