UE4 | Цикл день и ночь | Модификация SkySphere

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

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

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


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


hcb60qrpea9jjmt5epkmyo92gve.png


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


uuc5q9zbqocf6qjx3jivk-hioha.png

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


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

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


maeef_fbjh-0qy0zlwmqqkw1p-g.png


Пример кривой
jebxjnwz4wffra4nlgkfwfudpyw.png


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


Изменение уровней освещения
pnahq16t9que9s5ibs-ongxblua.png


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

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


Вот как-то так
svar4hd_cr_waskgntdl-h4v47o.png

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

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

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


Blueprint

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

i7hbiewnz563pf3o03ayopkyu-4.png

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


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

© Habrahabr.ru