Смена дня и ночи часто поднимается среди пользователей. И если само по себе движение солнца организовать достаточно просто, то добиться более или менее реалистичной работы ***SkySphere*** уже значительно сложнее.

В этой статье я не планирую показывать всевозможные способы изменения ориентации DirectionalLight с временами года и прецессией. На данную тему, на мой взгляд, материалов достаточно. Кто-то делает это через Blueprint, я же использую С++, таким образом, чтобы часики тикали на сервере и периодически (раз в несколько секунд) синхронизировали часы клиента. При этом на сервере никакого движения не происходит. Не барское это дело, двигать солнце по небу.


Далее я расскажу о возникающих проблемах и покажу мой вариант модернизации стандартного BP_Sky_Sphere для его корректной работы с дневным циклом.




Перед модификацией будет совсем нелишним скопировать все содержимое папки EngineSky в свою директорию, чтобы не испортить стандартный Blueprint и подключенные к нему ресурсы.





В первую очередь хочу рассказать о баге (или особенности) стандартной сферы. Прикрепленный StaticMesh для сферы имеет масштаб 400. Если изменить его на 1, то вроде бы ничего не поменяется, но немного пробежав вперед вы почувствуете себя как в фильме “Шоу Трумена”. Да, эта сфера хоть и огромна, но имеет свои границы. Явная проблема для открытых миров, которую очень легко исправить, заставив сферу двигаться вместе с игроком.



Конечно, в качестве альтернативы, можно сделать сферу еще больше, но мне такая идея не очень импонирует.




Следующим пунктом идет настройка нормальной ночи. Мне категорически не нравится, что звезды появляются только в полночь, а все остальное время — это просто какой-то затянувшийся вечер.


Тоже достаточно просто решается настройкой существующих кривых и добавлением новых.



Пример кривой



Следующая проблема, это затухание света для DirectionalLight и SkyLight. Достаточно странно наблюдать, что ночью видно ничуть не хуже, чем днем. Тоже решается очень просто, добавлением и настройкой кривых.


Изменение уровней освещения



Ну, и на десерт… Звезды не движутся! Если ночь длинна и полна ужасов, то может игрок это и не заметит. Но мы же за серьезный подход?


Сначала я заставил двигаться текстуру звезд, добавив дополнительные переменные к материалу.


Вот как-то так

Пока солнце движется по экваториальной плоскости — все в порядке. Но вот при имитации высоких широт начинаются математические сложности и нежелание текстуры закручиваться так как нам хочется. Но мы же за серьезный подход? :)


В итоге, принял решение делать две небесные сферы. Одна с облаками, солнцем и небом, а вторая, немного большего размера, со звездами. Дополнительную сферу подключил к тому же BP_Sky_Sphere и вежливо попросил ее вращаться вместе с солнцем…


И самая интересная часть! Сделать меньшую небесную сферу частично прозрачной. Просто так подключив логику материала к Opacity, конечно же получил к замечательные звезды, светящие через черные ночные облака. Поэтому опять пришлось доработать напильником материал, фактически нарисовав два неба. Одно с черными ночными облаками для визуального ряда. И второе, со всегда белоснежными облаками, для Opacity. Плюсом добавил много-много белого в дневное время, фактически сделав небо непрозрачным, чтобы просвечивающая синева не пугала своей глубиной.


Blueprint

Картинка кликабельна


Material







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




Если есть идеи, как сделать это проще, пожалуйста поделитесь. Буду благодарен.

Комментарии (19)


  1. VBKesha
    07.08.2018 23:41
    +1

    Не помешало хотя бы пару скринов, конечного результата.


    1. SvarogZ Автор
      08.08.2018 04:30

      Конечный результат по скриншотам не оценишь. Я видел много статичных сцен выполненных куда лучше.


      Акцент был сделан на динамику.


      К тому же я еще не сделал более тонкую настройку кривых яркости, да и над материалом звездного неба нужно еще поработать. Думаю, окончательную настройку буду делать ближе к выпуску проекта, когда будет закончен ландшафт. А это еще нескоро.


  1. Heinhain
    08.08.2018 07:53

    Двигать по каждый кадр сферу выглядит как минимум странной идеей. Следовало бы добавить скринов к описаниям промежуточных итогов и видео с конечным результатом, иначе неясно, что в итоге получилось.
    P.S. Чем это решение лучше того же True Sky?


    1. SvarogZ Автор
      08.08.2018 13:32

      True Sky пока не занимался. Написал про то, что знаю. Киньте ссылочку. Почитаю...


    1. SvarogZ Автор
      08.08.2018 22:04

      Двигать по каждый кадр сферу выглядит как минимум странной идеей.

      А как бы Вы решили проблему забегания за край купола?

      Прочитал что Эпики неравнодушны к BP_Sky_Sphere. И решил разрбраться как это работает.


  1. Flakky
    08.08.2018 11:02

    Я бы рекомендовал контролировать не только яркость источников света, но и их свет. Для этого можно поставить белую кубмапу на Скайлайт и подстраивать цвет кривыми.
    www.youtube.com/watch?v=zx6cNncp5tw&list=PLatwj2blGTZ5M7XL2sT92wrkrMov330FF&index=22
    Вот в этом стриме я как раз занимаюсь всем этим, думаю будет полезно кинуть сюда ссылочку.


    1. SvarogZ Автор
      09.08.2018 00:07

      Обязательно посмотрю, только я не понял зачем это, если SkySphere полностью скрывает стандартное небо.
      Или иммется ввиду спектр изучения? Чтобы отраженный свет был более реалистичным?


      1. Flakky
        09.08.2018 10:58

        Я имел ввиду SkyLight, который освещает сцену. Что бы её тоже кривой менять (например на закате из-за оранжевого неба, сцена должна быть слегка оранжевая).


  1. BingoBongo
    08.08.2018 16:57

    Можно вообще сферу заменить на материал в PostProcess, тогда вся ненужная блюпринтовая каша исчезнет.


    1. SvarogZ Автор
      08.08.2018 22:07

      А поподробнее можно?


      1. BingoBongo
        08.08.2018 22:20

        Смотри как делают колебание изображения будто камера по водой. Вот точно также можно перехватить отрендеренную сцену и определив задний фон по depth буферу нарисовать небо.


        1. SvarogZ Автор
          09.08.2018 00:00

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


          1. BingoBongo
            09.08.2018 11:04

            Со звездным куполом как раз проще, единственная проблема: надо понимать как работают view-projection матрицы чтобы у неба текстурные координаты натянуть на сферические. Ссылок нет (


    1. Flakky
      09.08.2018 11:01

      А какой в этом смысл? Эффект объема так придавать куда сложнее, да и анимировать сложнее… Конечно заморочиться можно, но как по мне, в этом мало смысла. Только разве что общую атмосферу, но облачка не так просто будет сделать.


      1. BingoBongo
        09.08.2018 11:16

        1. Сама по себе большая сфера с реальными (а не относительными к камере) координатами и таким же размером — это какой-то костыль, ее нужно рендерить отдельной камерой с фиксированными координатами;
        2. Анимировать без разницы где, можно также передать sun_height или любой нужный параметр времени;
        3. Облака будут выглядеть один в один как со сферой, но если вдруг захочется что-то поменять — у сферы доступно только натягивание на сферу, а в чистом материале уже можно подключить любую модель;

        Использовать BP_SkySphere тоже не так уж и плохо — она работает «из коробки». Но модифицировать и навешивать новые возможности на нее неудобно.


        1. Flakky
          09.08.2018 11:29

          Удобнее всего просто юзать атмосферу из Atmospheric Fog или Height Fog. А облачка довешивать уже как нужно. Тут я полностью соглашусь, что сфера не ахти. Но постобработка не многим удобнее :)


          1. SvarogZ Автор
            10.08.2018 00:50

            А как навешивать звезды и изменение цвета неба?
            С этим еще не разбирался. Может ссылочки есть? :)
            Как я понял, как минимум цвет должет вытаскиваться из Atmospheric Fog?


            1. Flakky
              10.08.2018 11:04

              Самый простой, сфера. Впрочем, можно и экранным эффектом.

              Цвет можно вытаскивать и кривой, так проще и более гибко.


        1. SvarogZ Автор
          10.08.2018 00:40

          Сама по себе большая сфера с реальными (а не относительными к камере) координатами и таким же размером — это какой-то костыль

          Разве относительные координаты это не то же самое, что и двигать сферу вслед за персонажем каждый тик?
          Использовать BP_SkySphere тоже не так уж и плохо

          Значит, пока не увижу нового туториала на другие методы, оставляю все как есть.