SceneKit: почему добавление точечного света чернит пол?
Снимок экрана № 1 показывает простую сцену SceneKit только с рассеянным освещением (добавлено явно, а не по умолчанию).
Снимок экрана № 2 показывает, что происходит после добавления прожектора. Весь пол становится черным. Этот прожектор имеет свойства по умолчанию после добавления прожектора в редакторе SceneKit.
Это также происходит с направленным светом.
Чтобы было понятно, подразумевается, что сцена по умолчанию содержит окружающее освещение. Тем не менее, мы добавили явное освещение (и даже протестировали с двумя) перед добавлением точечного / направленного света. Таким образом, теория света по умолчанию, упомянутая в этом вопросе, больше не применяется. Отсюда и путаница.
Предполагается, что точечные и направленные источники света добавляют свет к определенной области сцены, что понятно. Но они не должны затемнять области за пределами их видимости, верно?
Новичок в 3D-графике и SceneKit, поэтому любые советы очень ценятся.
0 ответов
Пустая сцена SceneKit (без добавленного света) имеет по умолчанию всенаправленный свет, который вы можете легко включить или выключить:
sceneView.autoenablesDefaultLighting = true
Посмотрим, что об этом говорится в документации Apple:
Если значение этого свойства равно false (по умолчанию), то для визуализации сцены SceneKit использует только те источники света, которые содержатся в графе сцены. Если вы измените значение на true, SceneKit автоматически добавит и разместит всенаправленный источник света при рендеринге сцен, которыене содержат света или содержат только окружающее освещение.
Когда вы добавляете источники света в свою сцену, они ведут себя соответственно. Основные принципы:
Если добавлен новый источник света, индикатор SceneKit по умолчанию выключается.
Если свет
rays are parallel to any 3D surface
эта поверхность будет черной.- Этот тип поведения характерен для направленного света, а иногда и для прожектора.
- Это потому, что SceneKit не имеет опции глобального освещения (или вторичных световых лучей).
Окружающий свет всенаправлен и НЕ затухает. Он имеет только штриховку для нормалей поверхности.
Точечный свет является всенаправленным и имеет затухание (свет теряет свою интенсивность в зависимости от расстояния).
Вот почему пол в вашей сцене стал черным.
И помните - вы можете легко включить или выключить любой свет:
@IBAction func turnLight(_ sender: NSButton) {
if counter % 2 == 0 {
ambientLightNode.isHidden = true
} else {
ambientLightNode.isHidden = false
}
counter += 1
}
Решение:
Когда вы освещаете сцену, вам нужно использовать несколько типов света. Если вы используете только направленный свет, поверхности некоторых объектов в вашей сцене будут черными, поэтому используйте дополнительный окружающий свет с низкой интенсивностью (200...500 люмен), чтобы осветлить эти черные поверхности. Не используйте слишком много точечных источников света, потому что каждый точечный свет представляет собой набор из 6 прожекторов с конусами под углом 90 градусов. Таким образом, каждый точечный свет с включенными тенями требует больших вычислений!