Возможно ли иметь SCNNode, который является прозрачным, но который закрывает любой объект позади него?
Итак, чтобы быть ясным в моих целях, так как у меня нет никакого кода для обмена... Допустим, у меня есть SCNNode, который расположен между камерой и другим SCNNode. Первый SCNNode является SCNBox, но не имеет текстуры, поэтому за ним можно увидеть второй SCNNode. Я хочу дать первому узлу прозрачный материал, но он также должен перекрывать все узлы позади него, как если бы он был непрозрачным. В обычной сцене это будет означать, что вы можете видеть цвет фона сцены, возможно черный, но я планирую сделать это в ARKit, что имеет больше смысла, поскольку это означает, что вы просто увидите реальный мир за ним.
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
является то, что если мы делаем так, как будто куба даже нет, то полностью прозрачные пиксели не сохраняются в буфере глубины.