У каждой планеты, в виде “из космоса”, существует две стороны: “дневная” – освещенная светом Солнца, и противоположная – “ночная”, на которую свет не попадает.
При моделировании сцены с планетой, не сложно добиться такого эффекта в освещении. Достаточно оставить в сцене только один источник света и расположить его с нужной стороны. Однако, полученный результат будет совсем не так хорош, как настоящие фотоснимки из космоса. Чтобы достичь большего сходства, на “ночную” сторону моделируемой планеты стоит положить соответствующую текстуру, с затемненной поверхностью и яркими огоньками – светом ночных мегаполисов.
Подготовим две текстуры: “дневную” и “ночную” – для каждой стороны планеты.
Создадим Землю:
- Создать сферу
- shift+a – Mesh – UV Sphere
- В Т-панели
- Transform
- Shading установить Smooth
- Transform
- Добавить модификатор Subdivision Surface
Создадим источник освещения – условное “Солнце”:
- Создать плоскость и направить ее плоской стороной к Земле:
- shift+a – Mesh – Plane
- Немного отодвинуть ее и увеличить
- g – x – 5 – ввод
- Координаты плоскости освещения после перемещения будут X = 5, Y = 0, Z = 0. Они понадобятся в дальнейшем, при настройке дерева нодов.
- s – 2 – ввод
- g – x – 5 – ввод
- Создать привязку:
- Выделить плоскость
- С зажатым shift выделить сферу
- ctrl+t – Track To Constrait
- Чтобы плоскость всегда смотрела на планету стороной а не ребром – развернуть ее
- Выделить плоскость
- Перейти в режим редактирования (tab)
- r – y – 90 – ввод
- Выйти из режима редактирования (tab)
- Создать для плоскости материал источника освещения
- В редакторе нодов Node Editor
- Создать новый материал для плоскости
- Заменить нод Diffuse на нод Emission
- Выделить нод Diffuse
- shift+s – Shaider – Emission
- Strength = 5
- В редакторе нодов Node Editor
Корректно наложим на планету подготовленные текстуры. Сделаем отдельную ветку нодов для “дневной” и “ночной” текстур:
Остается правильно соединить созданные ветки нодов по терминатору – линии, отделяющей освещенную сторону планеты от неосвещенной так, чтобы на освещенной части планеты использовалась “дневная” текстура, а на неосвещенной – “ночная”.
К сожалению, в нодах Blender нет входного параметра, который давал бы значение освещенности в точке шейдера. Однако для решения задачи можно воспользоваться тем, что в любой точке сферической поверхности нашей планеты известен вектор нормали. Привлечем на помощь немного векторной математики и посмотрим на сферу в разрезе. Можно заметить, что угол между векторами нормалей к поверхности сферы (изображены синим цветом) и векторами падающего на поверхность света (изображен желтым цветом) равномерно меняется от 0 до 90 градусов как раз так, как меняется освещенность сферы-планеты.
Примем угол равный 0 градусов за полную освещенность. Тогда любое увеличение значения этого угла будет соответствовать падению освещенности поверхности в текущей точке. Осталось получить значение этого угла и использовать его, как фактор смешения “дневной” и “ночной” текстур планеты.
Для получения нужного угла у нас есть вектор нормли к поверхности планеты, но нет вектора падающего на поверхность света. Впрочем, зная положение самого источника света, можно получить и требуемый вектор. Имеются два вектора: из точки начала координат в точку расположения источника света (изображен красным цветом) и в точку расположения сферы-планеты (изображен зеленым цветом). Искомый вектор (желтого цвета) будет равен разнице этих двух векторов.
Перенесем полученный вектор в систему нодов.
- В редакторе нодов в материале Земли создать три нода значений – через них мы зададим положение источника света.
- shift+a – Input – Value
- shift+d – переместить
- shift+d – переместить
- Три нода Value скомбинировать в Vector
- shift+a – Converter – CombineXYZ
- Выходы нодов Value подать на входы нода CombineXYZ
- В значения нодов Value проставить три соответствующих координаты плоскости – источника освещения (п. 2.2.1.1).
- Добавить нод Object Info – через него мы получим положение сферы-планеты
- shift+a – Input – Object Info
Чтобы получить вектор падающего на поверхность сферы освещения, нужно из вектора положения “Солнца” вычесть вектор положения планеты.
- Добавить нод векторных операций:
- shift+a – Converter – Vector Math
- выбрать операцию вычитания: Subtract
- на верхний вход Vector (Vector Math) подать выход Vector (CombineXYZ)
- на нижний вход Vector (Vector Math) подать выход Location (Object Info)
- shift+a – Converter – Vector Math
- Полученный в результате вектор привести к нормализованному виду – сделать его длину равной 1.
- Добавить нод Vector Math
- shift+a – Converter – Vector Math
- выбрать операцию нормализации: Normalize
- на верхний вход Vector (Vector Math) подать выход Vector (Subtract)
- значения нижнего входа Vector (Vector Math) установить равным 1,1,1
- shift+a – Converter – Vector Math
- Добавить нод Vector Math
В результате получен нормализованный вектор освещения, падающего на поверхность сферы.
Теперь нужно получить угол между этим вектором и нормалями к поверхности сферы. В векторной математике скалярное произведение двух векторов – это число, характеризующее соотношение длин этих векторов и угла между ними. Вектора нормалей нормализованны изначально, а вычисленный вектор освещения мы нормализовали специально, следовательно длины всех векторов у нас равны 1, а значит соотношение их длин тоже будет равно 1. Скалярное произведение векторов в этом случае будет зависеть только от угла между векторами и равно косинусу этого самого угла. Косинус меняется от 0 до 1, что для системы нодов даже удобнее, чем угловые значения.
Получим характеристику нужного угла в дереве нодов:
- Добавить нод, который даст нам значение вектора нормали в текущей точке
- shift+a – Input – Geometry
- Добавить нод векторных операций
- shift+a – Converter – Vector Math
- выбрать операцию скалярного произведения (Dot Product)
- на верхний вход Vector (Dot Product) подать выход Vector (Normalize)
- на нижний вход Vector (Dot Product) подать выход Normal (Geometry)
- shift+a – Converter – Vector Math
В результате мы получили значение, характеризующее угол между нормалями поверхности планеты и падающим на ее поверхность светом. Используем это значение для смешивания двух подготовленных ранее текстур дня и ночи.
- Добавить нод смешивания шейдеров
- shift+a – Shaider – Mix Shaider
- выход Shaider (Mix Shaide) подать на вход Surface (Material Output)
- на верхний вход Shaider (Mix Shaider) подать выход BSDF (Diffuse) нода с “дневной” текстурой
- на нижний вход Shaider (Mix Shaider) подать выход BSDF (Diffuse) нода с “ночной” текстурой
- на вход Factor (Mix Shaider) подать выход Value (Dot Product)
- shift+a – Shaider – Mix Shaider
Теперь на освещенной стороне планеты показывается “дневная” текстура, а на неосвещенной – “ночная”. Однако угол между нормалями и освещением, в зависимость от которого мы поставили смешение текстур, изменяется равномерно от самой яркой точки на поверхности до самой темной, из-за чего текстуры начинают смешиваться практически сразу, терминатор планеты получается слишком размытым, а на большей части “дневной” стороны планеты заметно, как проступает “ночная”. Для корректировки введем в дерево нодов нод Color Ramp:
- Добавить нод Color Ramp
- shift+a – Converter – Color Ramp
- вставить его между выходом Vector (Dot Product) и входом Factor (Mix Shaider)
- сдвинуть правый (светлый) бегунок нода Color Ramp влево, подкорректировав границу светораздела.
Теперь на освещенной стороне остается четкая “дневная” текстура, на неосвещенной – “ночная”, а на границе светораздела мы видим быстрый переход из одного состояния в другое.
Полное дерево нодов выглядит так:
Можно настраивать сцену и отправлять Землю на рендер.
Во время настройки сцены следует помнить, что при перемещении источника освещения планеты, в построенном для планеты дереве нодов нужно также ввести новые координаты источника света для того, чтобы разделение “дня” и “ночи” происходило правильно.
Текстуры дневной поверхности Земли и ночной поверхности Земли взяты с сайта nasa.gov только в образовательных целях.