Умный рабочий стол, который живёт по солнцу
- суббота, 17 января 2026 г. в 00:00:06
Идея «умного» рабочего стола у меня появилась давно. Под "умным" я понимал не виджеты, прогнозы погоды и не очередную анимацию, а максимально простую идею: фон рабочего стола должен соответствовать тому времени суток, которое сейчас у меня за окном. Без условностей. Только солнце.
Формально проект отслеживает исключительно положение солнца, но этого оказалось более чем достаточно, ведь в качестве фона был выбран Minecraft. Его визуального языка вполне хватает, чтобы день, закат, ночь и рассвет ощущались естественно и без дополнительных пояснений.
В качестве сцены был взят наш основной мир, в котором мы выживаем уже около четырёх лет. Это не декоративная карта и не специально построенная локация "для красоты". Это живой мир с историей, следами времени и функциональными постройками. Именно это и делало его идеальным кандидатом: никакой постановки, только реальность, но в пиксельном виде.

В основе всего лежит обычный HTML. Это был осознанный выбор: и на Linux (KDE), и на Windows (через Wallpaper Engine) есть возможность использовать HTML-страницу в качестве обоев. Один код на две платформы.
Для расчёта движения солнца я использовал библиотеку suncalc. Она позволяет по географическим координатам определить все ключевые фазы солнца в течение суток. Зная это, я просто переводил положение солнца в проценты и подставлял соответствующее изображение фона.
И этот код был самой простой частью проекта)
Настоящая сложность началась там, где понадобились сами изображения. Нужны были десятки (а на деле почти соточка) кадров одного и того же места, но с разным положением солнца и освещением.
К счастью, был найден replay-мод для Minecraft, который позволял:
выбирать точное разрешение,
экспортировать сцену в виде PNG-кадров.
Идея с таймлапсом рассматривалась, но я её быстро отбросил. Вместо этого я пошел более контролируемым путём.
Полные сутки в Minecraft это 24 000 тактов. Я разделил их на 96 фрагментов по 250 тактов каждый. Затем, отключив естественное движение времени и используя командные блоки, получил около 12 000 кадров рендер которых занял большое время (4к изображения дают о себе знать).

И из каждого фрагмента нужно было выбрать один кадр который пойдёт в финальный цикл дня и ночи.
Первый раз это делалось вручную. Я буквально просмотрел все кадры, отбрасывая проблемные и копируя подходящие. Проблемы, к слову, были реальные: у первых кадров часто появлялись графические артефакты - не то из-за шейдеров, не то из-за внутренней логики Minecraft. Причину я так и не понял.
Во второй итерации проекта я нашёл утилиту perceptualdiff. В оригинальной задумке она определяет, есть ли видимая разница между двумя изображениями, и если есть - показывает количество отличающихся пикселей.
В моём случае утилита всегда находила различия, даже когда визуально изображения казались идентичными.
Я просто прогнал:
perceptualdiff 0.png 1.png
…и так примерно 12 000 раз (joke).
Дальше логика была простой:
если разница между текущим и следующим кадром резко отличается от разницы между предыдущими,
значит, текущий кадр последний «чистый»,
его и нужно сохранять. Для этого был написан небольшой JS-скрипт, который собирал результаты и сохранял нужные кадры автоматически.
Да, процесс всё ещё занимал около 4 часов и активно нагружал процессор.
Но это уже было не моё время и в этом была победа.
Поверх фона я добавил часы. Они довольно популярны, давно гуляют по интернету, и я неоднократно встречал их в других рабочих столах для Wallpaper Engine. К сожалению, автора оригинального кода я не знаю, впервые я увидел эти часы именно у другого пользователя WE. Тем не менее, визуально и концептуально они идеально вписались, особенно после применения шрифта Minecraft к ним.
Проект не планируется оставлять в статичном состоянии. В будущем я хочу заменить статические изображения на короткие зацикленные видеофрагменты. Это откроет больше возможностей для деталей и атмосферы.
В частности, хочется добавить пасхалки. За всё время в этом мире побывало не меньше восьми человек, и было бы интересно в случайный момент увидеть, как кто-то из них пробегает по сцене, занимаясь своими делами. Все необходимые заготовки для этого у меня уже есть.
С технической точки зрения задача тоже решаема. Для зацикленных видео можно взять последний кадр и сравнивать его со всеми предыдущими, подбирая точку, где анимации максимально совпадают. Основная сложность - вода и листва. Однако по моим наблюдениям, как минимум анимация листвы процедурно генерируется из шума: она либо вовсе не циклична, либо имеет очень большой период. Это усложняет задачу, но не делает её невозможной.
Отдельного внимания заслуживает вопрос разрешений. У меня два FullHD-монитора (1 из них 21:9), но мир постепенно смещается в сторону больших разрешений и нестандартных форматов. Именно поэтому рабочий стол изначально поддерживает 4K и формат 21:9, чтобы никто не чувствовал себя обделённым (за исключением, разве что, владельцев 8K :) ).
Из-за этого изображения в формате PNG без сжатия весят крайне много, поэтому дополнительно был подготовлен вариант в JPG как среднее между качеством и размером.
Проект выложен в открытый доступ:
— на GitHub,
— и в мастерской Steam для Wallpaper Engine.