SceneKit: почему добавление точечного света чернит пол?

Снимок экрана № 1 показывает простую сцену SceneKit только с рассеянным освещением (добавлено явно, а не по умолчанию).

Снимок экрана № 2 показывает, что происходит после добавления прожектора. Весь пол становится черным. Этот прожектор имеет свойства по умолчанию после добавления прожектора в редакторе SceneKit.

Это также происходит с направленным светом.

Чтобы было понятно, подразумевается, что сцена по умолчанию содержит окружающее освещение. Тем не менее, мы добавили явное освещение (и даже протестировали с двумя) перед добавлением точечного / направленного света. Таким образом, теория света по умолчанию, упомянутая в этом вопросе, больше не применяется. Отсюда и путаница.

Предполагается, что точечные и направленные источники света добавляют свет к определенной области сцены, что понятно. Но они не должны затемнять области за пределами их видимости, верно?

Новичок в 3D-графике и SceneKit, поэтому любые советы очень ценятся.

Снимок экрана № 1:

Снимок экрана № 2:

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 градусов. Таким образом, каждый точечный свет с включенными тенями требует больших вычислений!

Другие вопросы по тегам