Дневник разработки #4: лес, снег и погода
Метель в игре режет обзор вдвое, увеличивает разброс выстрелов в два с половиной раза и сажает на землю всю авиацию. Когда я это настраивал, я окончательно понял, что погода у меня не декорация, а часть правил боя. Об этом и о деревьях, с которых всё началось, эта часть.

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

Так выглядели заглушки. Сначала получилась низкополигональная стилизация, а во второй листья были нарисованы процедурно прямо в Blender, и выглядело это как клипарт. Третий вариант оказался рабочим: я взял бесплатные сканы с сайтов ambientCG и Poly Haven и собрал листву из настоящих фотографий листьев и веточек. Ствол и ветви это трубы с фотографией коры, а крона состоит из карточек с листвой. В наборе три вида лиственных деревьев (дуб, бук и липа), по три ели и сосны, три куста и пять видов травы. У каждого дерева есть ближняя детализация от двух до четырёх тысяч треугольников и дальняя около четырёхсот.

Так выглядит лес в игре сейчас.
Ветер
Больше всего времени ушло на ветер. В первой версии вес ветра зависел от положения в кроне, и в игре я несколько раз видел одно и то же: ветки качаются отдельно от ствола, листья отдельно от веток, а ствол торчит из кроны. Решение я взял из SpeedTree: сдвиг считается тремя слоями, и каждый слой равен нулю в точке крепления к предыдущему. Ствол изгибается в зависимости только от высоты, ветвь продолжает движение ствола в месте крепления, а лист продолжает движение ветви и ещё трепещет кончиком. Теперь ветка не может оторваться от ствола, потому что в месте крепления она двигается точно так же, как он.
Редактор деревьев
Потом мне захотелось делать деревья самому и я сделал редактор деревьев. В нём задаётся рецепт: высота и изгиб ствола, число ветвей, размер и ориентация листьев, текстуры коры и бюджет треугольников, под который дерево подгоняется автоматически. Во второй версии добавились граф генераторов, сплайны с ручной правкой и редактор развёртки коры. Прямо в окне можно включить ветер и сезон с теми же параметрами шейдера, что и в игре, и сразу увидеть, как дерево будет выглядеть осенью или зимой. Там же есть база растений игры: можно заменить любой вид своим деревом, добавить новый вид и задать, в каких биомах он растёт.

На скриншоте окно редактора деревьев с включённой осенью.
Биомы и сезоны
У каждой карты теперь есть биом: умеренный лес, тайга, степь, пустыня и так далее. Биом определяет погоду, температуру и то, какая растительность растёт на карте. Одну и ту же карту можно играть в разные сезоны: лето, осень, зиму или весну, если автор карты это разрешил. Сезон выбирается в комнате перед матчем, и четыре версии карты запекать не нужно: рельеф и расстановка остаются теми же, а сезон меняет цвет земли и листвы и то, какие модели растений используются.

На скриншоте одна и та же точка карты в четырёх сезонах: мост через реку. Летом всё зелёное, осенью деревья желтеют и краснеют, зимой лежит снег, а река покрыта льдом с трещинами, весной крона светлая и молодая.

А это опушка у озера. Осенью трава выгорает до жёлтого, зимой деревья стоят голыми, весной на них появляются светлые молодые листья. Честно скажу, что весна и лето пока отличаются друг от друга меньше остальных сезонов, и это я ещё буду дорабатывать. Зимой снег лежит на земле, камнях, мостах, зданиях и технике, а осенью идёт листопад.
Погода
Погода зависит от биома. В начале матча она выбирается по правилам биома, а дальше каждые три-семь минут с некоторым шансом остаётся прежней, становится лучше или хуже, но только на одну ступень. Летом она идёт от ясной через пасмурную и дождь к грозе, а зимой от ясной через снегопад к метели, и перескочить сразу из ясной погоды в грозу не может. Что именно выпадет, решает температура: выше двух градусов это дождь, от нуля до двух мокрый снег, ниже нуля снег. Снег на земле накапливается во время снегопада и тает, когда становится теплее.
Погода влияет на бой, а не только на картинку, поэтому её считает симуляция, и у всех игроков в матче она одинаковая. Дождь оставляет 80 процентов обзора и увеличивает разброс выстрелов в полтора раза. Гроза оставляет 65 процентов обзора и увеличивает разброс вдвое, туман оставляет 60 процентов обзора, а метель 50 процентов с разбросом в два с половиной раза. В грозу, метель и пыльную бурю вся авиация остаётся на земле. Эти числа пока первые, я буду подбирать их по плейтестам.

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

А это метель: обзор вдвое меньше, и в снежной пелене почти не видно, кто с кем воюет.

И бой осенью на опушке: жёлтая трава, оранжевые и красные деревья, пасмурное небо.
Лес в бою
Лес я хотел сделать частью боя в обе стороны. Пехота в лесу получает на 30 процентов меньше урона от стрелкового оружия и на 20 процентов меньше от взрывов, а противник замечает её только на 40 процентах своего обзора, пока она не выстрелила: выстрел раскрывает позицию на три секунды. Зато и сам видишь из леса хуже, на 70 процентов, а техника в лесу едет со скоростью 60 процентов от обычной и каждые три секунды выдаёт себя шумом, который слышно на 30 единиц вокруг. Рядом сделаны и менее заметные вещи: деревья вырубаются под постройками, крона становится прозрачной над юнитами, чтобы они не пропадали под ней, а здания врага остаются на карте призраками в тумане войны.
Скорость
Лес и трава это десятки тысяч объектов на карте, и они съедали заметную часть кадра. Я переделал отрисовку растительности на видеокарту и настроил тени, и на двух тестовых картах кадры в секунду выросли с 42 до 51,7 и с 43,6 до 55,2.
Что дальше?
В следующей части расскажу про бота, который играет против меня и показывает ход своих мыслей, и про то, как он учится.
