Разделение сторон планеты на «дневную» и «ночную»

У каждой планеты, в виде «из космоса», существует две стороны: «дневная» — освещенная светом Солнца, и противоположная — «ночная», на которую свет не попадает.

Разделение сторон Земли на "дневную" и "ночную"
Разделение сторон Земли на «дневную» и «ночную»

При моделировании сцены с планетой, не сложно добиться такого эффекта в освещении. Достаточно оставить в сцене только один источник света и расположить его с нужной стороны. Однако, полученный результат будет совсем не так хорош, как настоящие фотоснимки из космоса. Чтобы достичь большего сходства, на «ночную» сторону моделируемой планеты стоит положить соответствующую текстуру, с затемненной поверхностью и яркими огоньками — светом ночных мегаполисов.

Подготовим две текстуры: «дневную» и «ночную» — для каждой стороны планеты.

Текстура поверхности Земли (изображение с сайта nasa.gov)
Текстура «дневной» поверхности Земли (изображение с сайта nasa.gov)
Текстура ночной поверхности Земли (с сайта nasa.gov)
Текстура «ночной» поверхности Земли (с сайта nasa.gov)

Создадим Землю:

  1. Создать сферу
    1. shift+a — Mesh — UV Sphere
    2. В Т-панели
      1. Transform
        1. Shading установить Smooth
    3. Добавить модификатор Subdivision Surface

Создадим источник освещения — условное «Солнце»:

  1. Создать плоскость и направить ее плоской стороной к Земле:
    1. shift+a — Mesh — Plane
    2. Немного отодвинуть ее и увеличить
      1. g — x — 5 — ввод
        1. Координаты плоскости освещения после перемещения будут X = 5, Y = 0, Z = 0. Они понадобятся в дальнейшем, при настройке дерева нодов.
      2. s — 2 — ввод
    3. Создать привязку:
      1. Выделить плоскость
      2. С зажатым shift выделить сферу
      3. ctrl+t — Track To Constrait
    4. Чтобы плоскость всегда смотрела на планету стороной а не ребром — развернуть ее
      1. Выделить плоскость
      2. Перейти в режим редактирования (tab)
      3. r — y — 90 — ввод
      4. Выйти из режима редактирования (tab)
    5. Создать для плоскости материал источника освещения
      1. В редакторе нодов Node Editor
        1. Создать новый материал для плоскости
        2. Заменить нод Diffuse на нод Emission
          1. Выделить нод Diffuse
          2. shift+s — Shaider — Emission
            1. Strength = 5
Настройка освещения
Настройка освещения

Корректно наложим на планету подготовленные текстуры. Сделаем отдельную ветку нодов для «дневной» и «ночной» текстур:

Настройка "дневной" и "ночной" текстур
Настройка «дневной» и «ночной» текстур

Остается правильно соединить созданные ветки нодов по терминатору — линии, отделяющей освещенную сторону планеты от неосвещенной так, чтобы на освещенной части планеты использовалась «дневная» текстура, а на неосвещенной — «ночная».

К сожалению, в нодах Blender нет входного параметра, который давал бы значение освещенности в точке шейдера. Однако для решения задачи можно воспользоваться тем, что в любой точке сферической поверхности нашей планеты известен вектор нормали. Привлечем на помощь немного векторной математики и посмотрим на сферу в разрезе. Можно заметить, что угол между векторами нормалей к поверхности сферы (изображены синим цветом) и векторами падающего на поверхность света (изображен желтым цветом) равномерно меняется от 0 до 90 градусов как раз так, как меняется освещенность сферы-планеты.

Схема векторов нормалей и освещения
Схема векторов нормалей и освещения

Примем угол равный 0 градусов за полную освещенность. Тогда любое увеличение значения этого угла будет соответствовать падению освещенности поверхности в текущей точке. Осталось получить значение этого угла и использовать его, как фактор смешения «дневной» и «ночной» текстур планеты.

 Для получения нужного угла у нас есть вектор нормли к поверхности планеты, но нет вектора падающего на поверхность света. Впрочем, зная положение самого источника света, можно получить и требуемый вектор. Имеются два вектора: из точки начала координат в точку расположения источника света (изображен красным цветом) и в точку расположения сферы-планеты (изображен зеленым цветом). Искомый вектор (желтого цвета) будет равен разнице этих двух векторов.

Получения вектора освещения
Получения вектора освещения

Перенесем полученный вектор в систему нодов.

  1. В редакторе нодов в материале Земли создать три нода значений — через них мы зададим положение источника света.
    1. shift+a — Input — Value
    2. shift+d — переместить
    3. shift+d — переместить
    4. Три нода Value скомбинировать в Vector
      1. shift+a — Converter — CombineXYZ
      2. Выходы нодов Value подать на входы нода CombineXYZ
    5. В значения нодов Value проставить три соответствующих координаты плоскости — источника освещения (п. 2.2.1.1).
Задание положения источника освещения в дереве нодов
Задание положения источника освещения в дереве нодов
  1. Добавить нод Object Info — через него мы получим положение сферы-планеты
    1. shift+a — Input — Object Info

Чтобы получить вектор падающего на поверхность сферы освещения, нужно из вектора положения «Солнца» вычесть вектор положения планеты.

  1. Добавить нод векторных операций:
    1. shift+a — Converter — Vector Math
      1. выбрать операцию вычитания: Subtract
      2. на верхний вход Vector (Vector Math) подать выход Vector (CombineXYZ)
      3. на нижний вход Vector (Vector Math) подать выход Location (Object Info)
  2. Полученный в результате вектор привести к нормализованному виду — сделать его длину равной 1.
    1. Добавить нод Vector Math
      1. shift+a — Converter — Vector Math
        1. выбрать операцию нормализации: Normalize
        2. на верхний вход Vector (Vector Math) подать выход Vector (Subtract)
        3. значения нижнего входа Vector (Vector Math) установить равным 1,1,1
Получение вектора освещения в дереве нодов
Получение вектора освещения в дереве нодов

В результате получен нормализованный вектор освещения, падающего на поверхность сферы.

Теперь нужно получить угол между этим вектором и нормалями к поверхности сферы. В векторной математике скалярное произведение двух векторов — это число, характеризующее соотношение длин этих векторов и угла между ними. Вектора нормалей нормализованны изначально, а вычисленный вектор освещения мы нормализовали специально, следовательно длины всех векторов у нас равны 1, а значит соотношение их длин тоже будет равно 1. Скалярное произведение векторов в этом случае будет зависеть только от угла между векторами и равно косинусу этого самого угла. Косинус меняется от 0 до 1, что для системы нодов даже удобнее, чем угловые значения.

Получим характеристику нужного угла в дереве нодов:

  1. Добавить нод, который даст нам значение вектора нормали в текущей точке
    1. shift+a — Input — Geometry
  2. Добавить нод векторных операций
    1. shift+a — Converter — Vector Math
      1. выбрать операцию скалярного произведения (Dot Product)
      2. на верхний вход Vector (Dot Product) подать выход Vector (Normalize)
      3. на нижний вход Vector (Dot Product) подать выход Normal (Geometry)
Получение угла между нормалями и вектором освещения
Получение угла между нормалями и вектором освещения

В результате мы получили значение, характеризующее угол между нормалями поверхности планеты и падающим на ее поверхность светом. Используем это значение для смешивания двух подготовленных ранее текстур дня и ночи.

  1. Добавить нод смешивания шейдеров
    1. shift+a — Shaider — Mix Shaider
      1. выход Shaider (Mix Shaide) подать на вход Surface (Material Output)
      2. на верхний вход Shaider (Mix Shaider) подать выход BSDF (Diffuse) нода с «дневной» текстурой
      3. на нижний вход Shaider (Mix Shaider) подать выход BSDF (Diffuse) нода с «ночной» текстурой
      4. на вход Factor (Mix Shaider) подать выход Value (Dot Product)

Теперь на освещенной стороне планеты показывается «дневная» текстура, а на неосвещенной — «ночная». Однако угол между нормалями и освещением, в зависимость от которого мы поставили смешение текстур, изменяется равномерно от самой яркой точки на поверхности до самой темной, из-за чего текстуры начинают смешиваться практически сразу, терминатор планеты получается слишком размытым, а на большей части «дневной» стороны планеты заметно, как проступает «ночная». Для корректировки введем в дерево нодов нод Color Ramp:

  1. Добавить нод Color Ramp
    1. shift+a — Converter — Color Ramp
    2. вставить его между выходом Vector (Dot Product) и входом Factor (Mix Shaider)
    3. сдвинуть правый (светлый) бегунок нода Color Ramp влево, подкорректировав границу светораздела.

Теперь на освещенной стороне остается четкая «дневная» текстура, на неосвещенной — «ночная», а на границе светораздела мы видим быстрый переход из одного состояния в другое.

Полное дерево нодов выглядит так:

Полное дерево нодов
Полное дерево нодов

Можно настраивать сцену и отправлять Землю на рендер.

Во время настройки сцены следует помнить, что при перемещении источника освещения планеты, в построенном для планеты дереве нодов нужно также ввести новые координаты источника света для того, чтобы разделение «дня» и «ночи» происходило правильно.

  Текстуры дневной поверхности Земли и ночной поверхности Земли взяты с сайта nasa.gov только в образовательных целях.