На днях мой знакомый, накануне имевший сеанс коллективной рефлексии со своим новым боссом об итогах первого месяца совместной работы и откровенно поделившийся вызовами и проблемами, стоящими перед командой, получил уведомление об увольнении... И это напомнило мне историю из моего собственного детства:
Мне было лет 12 и это был то ли закат СССР, то ли уже ранняя Россия. Так или иначе, но в тренде была демократия, гласность и открытость, которые пришли и в нашу школу.
Школа решила вычислить показатель CSAT среди учеников и запустила анонимный опрос. Отвечать надо было открыто, не замалчивая проблемы и не опасаясь последствий.
Кто-то из учеников моего класса на вопрос "Какой предмет самый не любимый и почему" ответил - "Английский, потому, что учительница много кричит на уроке"...
И что началось...
Опрос-то, конечно, был анонимным, но сначала решили вычислить негодяя по почерку. Почему-то это не увенчалось успехом - то ли диверсант был опытен и шифровался, то ли тупо класс перепутал или умышленно указал в анкете не правильно, запутывая следы. Затем училка приступила к следующей ступени расследования - начала урок с объявления об этом досадном инциденте и описания того, какие усилия она прилагает для нашего качественного обучения и как всю душу отдает без остатка. Завершил выступление вопрос - "Кто это написал?". Повисла пауза, никто не сознался. На втором или третьем повторении вопроса с включенной опцией "я всё равно узнаю" ученики начали выдвигать предположения и создавать видимость всецелого участия в расследовании. Безрезультатно, шпион не выдал себя.
Поняв тщетность массового опроса, училка перешла к адресному - по очереди поднимая каждого ученика класса с места и проводя свой экспресс-опрос удовлетворенности и спрашивая нравится ли предмет и есть ли у ученика к ней какие-либо претензии. О понятии "социально одобряемый ответ" тогда еще никто не знал, а социологии училка, очевидно, была не обучена. Но все, как один, продемонстрировали максимальную лояльность как предмету, так и преподавателю и никаких замечаний к работе ни у кого, конечно же, не было и, вообще - кто мог такую возмутительную ложь написать (отметили наиболее лояльные учащиеся).
...
В классе было 2-3 не успевающих ученика, которым просто не давался да и не был интересен язык. Училка была мерзкая и в самом деле не только орала, но и время от времени кидалась тряпкой, как бы отмечая тщетность своих попыток донести благо просвещения до отстающих. На уроках царила давящая атмотфера, начисто убивающая интерес к предмету, так что негодяй изложил всё по факту.
А шпиона так и не вычислили, или, если и вышли на след, то не стали применять к нему какие-либо публичные меры отмщения.
Меня зовут Анатолий, и я программист с инженерным бэкграундом. Помимо основной деятельности, бэкенд разработки на Go, меня часто тянет собрать что-нибудь эдакое электронно-светодиодное с использованием микроконтроллеров.
Этап 0: Как всё начиналось
Однажды мне попался на глаза проект пиксельного стола, и я подумал, что было бы круто сделать стол не просто с красивыми визуальными эффектами, а ещё и с играми и звуковым сопровождением, т.е интерактивный. И я начал изучать тему…
Стол из интернета
Этап 1: Исследование существующих проектов
В интернете есть сотни проектов НЕинтерактивных (не реагирующих на касания) столов и матриц на адресных светодиодах, они предназначены исключительно для вывода красивых картинок. Вспомним тот же рюкзак с дисплеем от @AlexGyver:
Схемотехника у всех подобных проектов весьма простая: один контроллер + несколько сотен адресных светодиодов. Но для добавления игровых функций нужно как-то считывать нажатия.
Проектов же интерактивных столов в интернете встречается сильно меньше ввиду сложности электроники и огромных трудозатрат на сборку в домашних условиях.
Часть разработок не имеет обратной связи на нажатия, а выступают просто красивым светодиодным декором, а нам нужны интерактивные функции для игр и других эффектов. Это в разы усложняет разработку;
Все существующие проекты собраны на коленке и имеют огромные недочёты в плане трудозатрат на сборку: несколько сотен проводных соединений и точек пайки, десятки человекочасов работы. Такое нам не подходит, я слишком ленив, чтобы руками всё это паять, а значит нужны печатные платы без проводных соединений, разъём-в-разъём, плата-к-плате, side-by-side;
Конструкция корпуса зачастую тоже достаточно сложная, с вырезами/выпилами, с клеем или герметиком. Такое тоже не нравится, нужно что-то максимально простое из обычного мебельного ЛДСП, чтобы можно было заказать раскрой на ближайшем производстве;
Этап 2: Проектирование печатной платы
Изначально я решил сделать стол размера 25х15 пикселей, эдакий правильный прямоугольник со сторонами, кратными 5, т.е весь стол можно собрать из 15 плат размера 5х5, я называю их сегментами.
В качестве канала связи рассматривал RS485 и CAN:
RS485 подразумевает топологию master-slave, т.е нужно явно опрашивать все ведомые устройства, чтобы избежать коллизий, что будет сложно реализовать для такого количества пикселей;
А вот CAN позволяет организовать сеть равнозначных устройств и даже имеет аппаратный механизм арбитража коллизий. Идеальное решение для построения событийной модели обработки нажатий: есть клик – отправили, клика нет – молчим. Короче говоря, сообщения о нажатии отправляются в шину вне очереди, что позволит обрабатывать нажатия в кратчайшие сроки.
В качестве микроконтроллера был выбран самый популярный и дешёвый микроконтроллер с CAN шиной на борту – STM32F103, имеющий к тому же десятки китайских клонов на случай необходимости дальнейшей оптимизации по цене/наличию. Наверняка у каждого здесь есть завалявшаяся дома платка Blue Pill с подобным контроллером. Вот и у меня была.
В качестве светодиодов были выбраны обычные RGB адресные WS2812B. Тут всё очевидно – работают независимо при последовательном подключении:
В качестве датчика нажатия был выбран оптический сенсор VCNL36821S, комбинирующий в себе светодиод и фотодиод, работающие в ИК диапазоне длин волн 800..1000нм, а значит он не будет реагировать на RGB спектр светодиодов 400..700нм. С другой стороны, это не самое дешёвое решение, но точно одно из самых простых при автоматизированной сборке печатных плат. Один smd элемент и готово, никаких тебе емкостных сенсоров в виде улиток из проволоки (вспоминаем про желание избежать трудоемкости при сборке).
VCNL36821S
Сколько датчиков и светодиодов можно подключить к одному контроллеру STM32F103 в корпусе LQFP-48 без использования всякого рода расширителей портов? Все звёзды сошлись на размере сегмента 5х5 = 25 пикселей. В прототипе задействованы абсолютно все ноги контроллера, даже пришлось позаимствовать одну ногу SWD из разъёма для программирования.
Одна из сложностей при проектировании печатной платы заключалась в том, что у сенсора VCNL36821S отсутствует возможность задавать адрес I2C, а у микроконтроллера STM32F103 только две шины I2C. Как же быть? Ответ был найден на просторах Stackoverflow и заключался в коммутации линии SDA через диоды Шоттки. Гениально, как мне кажется:
Повторюсь, очень важно было избавиться от тысячи соединений на проводах и необходимости тратить сотню человекочасов на сборку. Поэтому плата разведена таким образом, чтобы вся сборка заключалась в последовательном соединении плат между собой на разъёмах и вообще не требовала дополнительной пайки. Вот что в итоге получилось:
Версия 1.0
Управлять столом будет обычная Raspberry Pi 4B+ вот с такой платой расширения для CAN шины:
Сами платы были заказаны в Китае на PcbWay с автоматизированной сборкой, т.е сам я ничего не паял.
Ну и затратная часть на платы:
Текстолит * 15 плат = 11 800 ₽
Компоненты * 15 плат = 29 600 ₽
Авто монтаж * 15 плат = 30 600 ₽
Доставка с Китая = 13 560 ₽
Итого: 85 560 ₽
Этап 3: Проектирование корпуса
Имея размер одной печатной платы, можно собрать всё это в деревянный корпус. Я выбрал формат обычного журнального столика.
В прототипе я решил сделать у стола равномерные отступы, чтобы расположить там малинку, блок питания и динамики, но позже понял, что это было плохой идеей:
Во-первых, такой отступ становится весьма неочевидным в играх, например пинг-понг, когда мячик отражается от невидимой стены;
Во-вторых, эстетически это смотрится весьма странно, когда поле светится не всё.
А для дополнительной электроники можно просто сделать двойное дно и доступ для обслуживания.
Оргстекло 3 мм нашел у местных рекламщиков и попросил вырезать прямоугольник нужного размера.
В качестве материала корпуса была выбрана фанера, т.к она намного крепче и долговечнее обычной мебельной ЛДСП.
Фанеру я сам покрасил в чёрный. Тоже то ещё занятие, больше не хочу, буду сразу брать лакированную.
Сетку вырезал на лазерном ЧПУ из фанеры 3 мм, размер каждой ячейки 4х4х4 см.
Затраты на корпусные детали:
Раскрой сетки из фанеры 3мм = 5 000₽
Фанера для корпуса стола + раскрой = 4 600 ₽
Акрил + резка = 4 200 ₽
Краска + валик = 1 750 ₽
Метизы, втулки, клей = 830 ₽
Покраска своими руками = Бесценно
Итого: 16 380 ₽
Этап 4: Написание прошивки и отладка
Для написания кода использовал программы STM32CubeMX и STM32CubeIDE, для прошивки и отладки китайские клоны программатора ST-LINK V2 и логического анализатора Saleae Logic. Вообще обожаю эту связку, никогда ещё программирование и отладка микроконтроллеров не были настолько простыми и доступными.
Из интересного, что можно было бы рассказать про написание прошивки:
Т.к контроллер весьма небольшой, и чтобы не тащить в проект тяжеловесную RTOS, я часто использую самописную систему событий, привязанную к 1 мс таймеру. Занимает буквально сотню строчек кода: установить событие через N мс, проверить готовность события к исполнению, очистить событие. Это покрывает практически все мои нужды по организации логики программы под микроконтроллер и занимает памяти чуть более, чем ничего.
Отдельно хочу рассказать про логику организации мной адресного пространства CAN. Я разбил адресное пространство 2048 адресов на 4 группы:
широковещательная команда;
целевые команды конкретным сегментам;
посылки от сегмента;
и в конце простые пакеты с цветами.
В CAN, чем ниже адрес пакета, тем у него выше приоритет. Это означает, что посылки от устройств (с кликом или ответом на запрос) имеют приоритет выше, чем пакеты с цветами. Таким образом, клик всегда будет получен почти мгновенно, даже когда идет активная “отрисовка” картинки и шина занята.
В коде я реализовал поддержку трех разных палитр:
RGB6 – 6 бит на цвет, где 3 бита цвет RGB, а 3 бита яркость 0-7;
RGB12 – 12 бит на цвет, RRRRGGGGBBBB;
RGB24 – 24 бита на цвет.
Т.к в стандартном CAN есть ограничение на 8 байт данных, то приходится делить адресные пространства ещё и на адреса конкретных пикселей внутри сегмента. А т.к на каждые 8 байт данных полезной нагрузки CAN имеет ещё оверхед 47 бит в виде адреса и других заголовков пакета, то с расширением палитры цветов, FPS падает непропорционально. Примерно вот таких значений мне удалось добиться при скорости CAN 500 kbit/s:
75 FPS для RGB6;
38 FPS для RGB12;
13 FPS для RGB24;
Я остановился на палитре RGB12: достаточная цветопередача при сохранении адекватной частоты кадров. Стоит отметить, что это максимальная частота кадров изображения, а с наличием большого числа нажатий, частота кадров будет проседать, т.к вспоминаем про приоритет кликов над пакетами цветов.
Для любознательных, ссылки на исходники платы и прошивки будут в конце статьи.
Расходы: бесплатно по ночам.
Этап 5: Финальная сборка и ошибки
Собрать всю сетку из таких коротких деревянных ламелей оказалось непросто. Я не предусмотрел достаточные допуски для пазов, детали то и дело не вставали на свои места, приходилось подпиливать и применять силу, в итоге плоскость с оргстеклом получилась неидеальной. В новой версии откажусь от пазов в платах, а ламели из фанеры сделаю длиннее, чтобы конструкция сетки получилась более ровной;
Как вы могли заметить, на платах я сделал разъёмы папа-мама на нижней стороне текстолита. Такая конструкция очень удобна при сборке и стоит три копейки, но делает стол абсолютно непригодным для ремонта, т.к нет возможности достать и заменить одну плату, приходится откручивать всех соседей;
Оргстекло, которое я нашел на местном производстве, как оказалось, плохо подходит для оптического сенсора, т.к имеет слабую светопропускаемость. Это приводит к очень маленькому полезному сигналу с датчиков и необходимости искать компромисс между ложными срабатываниями и “силой” (читай – площадью) нажатия;
Также я допустил небрежность и запитал всю матрицу плат двумя тонкими проводами… Как вы можете догадаться, долго такая сборка не проработала, больше 20А в пике как-никак. Решение простое – подкинуть питание ещё в несколько точек по периметру.
Сопутствующие расходы:
Блок питания 5V 150W = 4 560 ₽
Raspberry Pi 4B+ = 12 000 ₽
Плата расширения CAN = 2 940 ₽
USB Type C = 250 ₽
Плата аудиоусилителя = 296 ₽
Динамики + накладки = 407 ₽
Кабель AUX = 274 ₽
Разъём питания = 281 ₽
Кабель питания = Бесплатно от старого монитора
Сборка своими руками = Бесценно
Итого: 18 068 ₽
Этап 6: Управляющее ПО на Малинке
Моя любимая часть, моя гордость…
Годом ранее, работая над своим основным проектом Pixel Quest, я к нашему бэкенду на Go подключил Lua интерпритатор. С тех пор все игры нашей сети локаций разрабатываются на Lua.
Для Pixel Quest мы сделали открытую систему разработки игр. Что это значит:
во-первых, у нас есть визуальный конструктор игр "Пол–это лава", где можно попрактиковаться в покадровой отрисовке игр;
а во-вторых, у нас есть собственная онлайн IDE для разработки игровых сценариев на простом скриптовом языке Lua, который может освоить любой толковый школьник за несколько вечеров, при этом исходный код наших игр публично открыт в репозитории на GitHub, что делает обучение ещё проще.
В свой онлайн редактор для удобного тестирования игр мы добавили вот такую 3D визуализацию:
Также хочу отметить, что у проекта есть поддержка разных беспроводных геймпадов, что значительно расширяет игровые возможности.
Почему нас сравнивают с Roblox?
Роблокс даёт возможность игрокам самим разрабатывать игры и даже зарабатывать на них, и мы в перспективе хотим сделать что-то похожее. А ещё на ютубе нашу игру “Безопасный цвет” постоянно сравнивают с играми “Color blocks” или “Block party” из Roblox, хотя когда я её разрабатывал, я ещё ничего не знал о Роблоксе...
За счет открытости и легкости кода игровых скриптов, появляется возможность обучения детей программированию с дальнейшим тестированием на столе или даже на большом пиксельном полу в любом из наших центров.
Визуальный покадровый конструктор игр Пол – это лава
Этап 7: Версия 2.0
Для будущей версии я переразвёл печатную плату с учетом предыдущего опыта, а именно:
сделал разъёмы не горизонтальными, а вертикальными, таким образом можно будет вынимать и устанавливать отдельные платы. Платы между собой будут соединяться П-образными штырьками;
удвоил количество светодиодов, чтобы получить более яркую и сочную картинку, а также резервирование на случай выхода светодиода из строя;
сделал плату размером 4х5 пикселей, чтобы избавиться от “рамки” по краям и получить поле нужного размера 24х15 для совместимости с игровыми комнатами, а также расширить диапазон возможных CAN адресов с 16 до 32, что даст возможность строить столы большего размера;
Нашёл в Китае и протестировал новое более тонкое и более прозрачное оргстекло, которое даёт более чёткий рисунок граней пикселей и увеличивает полезный сигнал с датчиков в три раза, что делает игру более комфортной, а ложные срабатывания сводит к нулю.
Заключение
Небольшое видео, суммирующее вышесказанное:
Сам прототип с видео сейчас стоит и радует детей на одной из наших локаций, а именно в городе Смоленске.
Ссылки на исходники печатных плат, прошивки под микроконтроллер и другие полезные материалы по проекту можно найти вот в этом телеграм посте (будет обновляться): t.me/pixel_quest/360. Там же в канале будет выкладываться и новая информация по проекту.
Исходники управляющего ПО в открытом виде дать не готов, т.к они представляют коммерческую ценность, но в случае, если стол вызовет достаточный интерес у комьюнити, мы сможем предоставить специальную версию для запуска игр и удобной разработки собственных Lua сценариев.
Далее хотим попробовать наладить серийное производство. Мы считаем, что потенциал у проекта огромный, хотелось бы его развивать.
Какие сценарии развития продукта мы видим:
Установка в школы программирования или робототехники для обучения детей. Я сам разработчик и сам когда-то посещал подобный кружок программирования, думаю такой яркий стол сможет вызвать дополнительный интерес у ребят к разработке. А тем более возможность прийти поиграть в свою игру на большом пиксельном полу!
Установка в виде вендинговых игровых автоматов в ТЦ и для привлечения внимания к нашему основному бизнесу;
Размещение на локациях Pixel Quest в качестве дополнительного развлечения;
Использование в качестве отладочного стенда для тестирования ПО, игр и различных эффектов в миниатюре.
Если вдруг кто-то захочет собрать стол в домашних условиях и поучаствовать в разработке эффектов и игр, готовы помочь с закупкой и доставкой электроники с Китая. В последнее время с этим стало сильно сложнее, но у нас есть наработанные каналы оплаты и доставки.
Как вы считаете, в каком направлении больше перспектив?
Дорогой Пикабу, взываю к твоему коллективному разуму.
Прошу, оцени почтовые марки советского периода на сканах ниже и вынеси свой вердикт. В печку их или они ещё чего-то стоят? Может тут есть человек который опытным глазом быстро глянет на эту старую коллекцию и вынесет свой вердикт.
Правильно понимаю, что гашёные (имеющие печать почтовой службы) марки резко теряют в цене?
Время искать каждую на профильных ресурсах нет вообще никаких знаний. Нет даже знаний где такое искать. А скупщиков такого в моём городе нет, а если бы и были, то, боюсь, заберут что угодно за бесценок.
Как человек далёкий от всей этой филателии, изумился красотой каждой марки.
Майонез — один из самых популярных соусов, который подходит и к салатам, и к горячим блюдам, и к закускам. У каждого есть свой любимый вкус и марка. Давайте узнаем, какой майонез считается самым вкусным!
Тут вчера какой-то парень пост про ДнД накатал. Я хз, кто он такой вообще, но вроде как популярный. Значит, фэнтезийные миры, волшебные настолки, поведение игроков и мастеров какое-то время будут на пикабе в тренде. А потому я решил влезть на волне хайпа с историей, как я целый мир придумывал. В общем, обо всем по порядку. Итак, поехали?
Нет, не этот. Но я обожаю эту карту. Нет, серьезно, она гениальна в своей простоте. Банально по этой карте можно провести опупенное приключение
Интерлюдия
Штош, с самого с детского сранья я был тем еще фантазером. Ну, ожидать иного от мальчишки, который рано научился читать, в принципе нельзя. Так что я уже в детстве мог придумывать всякие сказки, потом дорос до выдумывания сюжетов для всякого будущего. А потом наткнулся на Хоббита. Ну, вы сами понимаете, что было дальше: Властелин Колец, разумеется. Слава Императору, что не Сильмариллион. В общем, я поплыл окончательно и бесповоротно - я влюбился в жанр фэнтези. И я начал генерировать свои миры - кучу, как я думал, разных, но все они, как я уже сейчас в своем старческом возрасте понимаю, были под копирку: вот тут страна хороших, вон там зона Злого (имя я не придумал, но обитает он в горах, там есть старый форт), а между ними - Мутные Болота, Высокие Горы, Дремучий лес и, разумеется, Башня Волшебника. Вот прям как на картинке в предисловии.
Но не буду на себя наговаривать - я все же был сообразительным ребенком, так что быстро понял, что все эти классические клише - это уже прошлый век. А потому я напрягся и создал шыдевр - полностью оригинальный мир, который я ниоткуда не слямзил. Я гордился фишкой этого мира - главный континент был в форме дракона. В общем, спасибо маме, что эти художества мои сохранила и недавно скинула мне поностальгировать.
Кстати, зацените: классическая работа мировоззрения белого европеоида: море с запада, прописанные страны на западе, на востоке - огромные полупустые пространства.
Так вот, придумывал я миры, рисовал карты и все такое. А потом мне подогнали почитать Перумова. Ну и... В общем, поначалу мне оно, конечно, понравилось, и я даже стал покупать книжки как не в себя, но по мере взросления у меня формировалась уверенность, что фэнтези - это пиздец какое дешманское третьесортное чтиво, полное Громких Слов с Большой Буквы, но не несущее никакой ценности. Спасибо Нику Данииловичу, да. Но, опять же, сейчас я наверное сказал бы ему спасибо за детские эмоции. Но вот охоту читать этот жанр он у меня из-за эпопеи про Некроманта отбил надолго.
Но время шло, шло, шло. И в какой-то момент я познакомился с ДнД. Познакомился - это в смысле прям в настолку сыграл, так-то я до этого уже про НвН знал, хоть и не понимал, мол, какой еще к черту бросок кубика, что значит "урон 2d6", дайте мне нормальные цифры. В общем, поиграл я в настолку. И, как увлекающийся мальчик, захотел поводить ее сам. Но поскольку водить по готовым сценариям мне не хотелось, нужно было что-то придумывать. И вот тут из глубин памяти всплыл мир, в котором континент имеет форму дракона.
И так начинается наша история.
А в чем вообще ссуть-то?
Вообще создание своего мира может идти двумя путями.
Первый способ - это от мелкого к крупному, и он по большому счету самый адекватный, если ты не продумываешь сценарий от начала и до конца, а полагаешься на импровизацию. В принципе твой мир растет вместе с игроками - сперва деревенька, потом округа, маленький городок, городок поболбше, городок болбшой ваще жесть. Плюсы этого подхода: ты не заморачиваешься на счет лишней информации. Минусы: ау, мы на пикабе, минусов нет!
Второй способ - от крупного к мелкому. Ты сразу делаешь мир. Всю его историю, всю его мифологию, прописываешь ключевые локации, персонажей, отмечаешь важные вехи сценария. Плюсы: ты готов ко всему, у тебя кипа раздаточного материала, тебе не приходится ломать голову, если персонажи решат пойти куда-то не туда. Минусы: весь твой мир, вся твоя раздатка нужна только тебе, игрокам большая история нахер не сдалась, а все твои тонкие намеки и хитроумно закрученные сюжетные повороты сработают только в том случае, если ты ведешь по жестким рельсам.
Но мы не ищем легких путей, а потому я на своих игроков сразу вывалил целый заготовленный мир (спойлер: раздатку никто так и не прочитал). И история этого мира начиналась так: когда-то очень давно какой-то космический дракон летел себе по космосу, а ему навстречу летела огромная комета. Космос, конечно, бескрайний, но дракон с кометой все равно встретились. Комете-то чего, она железно-никелевая, а вот дракону не повезло, и он от удара комету эту обнял и на ней же помер. А потом прошли миллионы лет, из плоти дракона появилась земля, из костей - горы, из крови - вода. Ну и так далее, в принципе, банальное мифотворчество. Но к этому миру полагалась карта. О, с каким ностальгическим похрюкиванием я ее рисовал! Вот она:
1/4
И нет, это не пенис! Это хвост! А дальше в карусели - уже местные карты. Видите в центре незакрашенные земли? Первые игры были там, так что вторая карта - это сами Ничейные земли, а дальше - вообще совсем местные
В общем, первые игры проводились по этим картам. Разумеется, первый блин был комом. Но главное - мне целиком и полностью перестал нравиться сам мир. Нет, с точки зрения логики сеттинга было все в порядке - фракции, другие фракции, третьи, все вокруг интригуют. Но вот чем больше я смотрел на карту, тем больше мне она не нравилась. А потому я решил ее отретконить. Как и весь мир в целом. Я решил сделать все более или менее правильно, чтобы сеттинг был привычен и для нашей земной логики. И начать нужно было с самых основ - с сотворения мира.
Короче говоря, сейчас я - и вы вместе со мной - буду делать этот мир. Зачем? А пусть будет. Ведь рисование карт - это не только про ДнД, но и "молодые талантливые авторы" тоже иногда этим грешат. Так что вдруг пригодится или будет интересно.
В начале сотворим небо и землю
Короче говоря, идея остается прежней: дракон, комета, акт космической любви с фатальными последствиями - и сотворение мира из этого непотребства. Что нам понадобится? Совсем немного: терпение, больше терпения, фантазия, инструмент для рисования (ручка и бумага, краски, карандаши, у меня же - Wonderdraft, программка для рисования фэнтезийных карт, лучший подарок задроту).
Вообще, что мне не нравилось в первую очередь в предыдущей карте - форма континента, то, что дракон не похож на дракона, то, что он занимает всю карту целиком, то, что нет ощущения масштаба. Я решил сперва проверить, как должен лежать дракон на глобусе. Иии... И на мое счастье у меня был установлен Blender. Хотя кого я обманываю, я его специально скачал и полночи смотрел обучалки на Ютубе. Ничего в них не понял, но все равно Блендер открыл, забубенил там сферу, натянул на нее текстуру и стал по ней рисовать. В итоге получил вот такую штуку:
В чем соль этой гифки? Я на поверхности сферы (она же - наша комета) нарисовал силуэт дракона (вид сверху), то, как он лежит на этой комете и как на ней разлагается. Посмотрел я на это дело и сказал, что это, конечно, хорошо, но кое-чего не хватает. А не хватало проекции на плоскость, так что я сделал развертку этой сферы. Обычная цилиндрическая проекция, которая выглядела вот так:
Качество убогое, потому что я тупо скриншотом это делал.
Собсна, теперь мы видим, как должен выглядеть наш континет-дракон на плоской карте. Разумеется, здесь огромная проблема с полюсами, ведь на глобусе хвост и голова практически лежат на южном и северном полюсах. Но... Народ, это ж всего лишь фэнтезийная карта, а мы не Меркатор, который сделал для величия России больше всех.
Теперь мы открываем Wonderdraft и начинаем рисовать. Формат карты - 2:1, именно такое соотношение ширины к высоте у развертки сферы. И рисуем мы сперва просто общие линии, чтобы просто понимать, что у нас должно получиться в итоге, что где находится, когда закончится, что нам за это будет. Третий шаг выглядит вот так:
Я нарисовал силуэт дракона, нарисовал одну оторванную лапу (вторая тоже оторвалась, но улетела в космос, окаменела и теперь висит в небе вместо Луны, ага), а хвост порубил на куски - ну, дракон же сильно в комету ударился, все кости себе переломал.
Теперь же предстоит самое сложное и муторное - формирование береговой линии, окончательное придание континенту формы. Вообще нам хорошо, у нас мир полностью волшебный, а что было бы, если бы пришлось рисовать планету, где не крылатая ящерица сверху грохнулась, а двигались литосферные плиты? Именно так я себя успокаивал, пока двигал мышкой по холсту. Три. Гребаных. Часа. Куча выпитого чая. Хрен знает сколько выкуренных сигарет. Я сорок тысяч раз пожалел, что вообще взялся за это дело. Но, слава Императору, я это сделал. В итоге получил вот что:
Ну да, я люблю, когда береговая линия неровная, а суша приподнята над водой. Как по мне, так выглядит красивше. Но я не отрицаю, что у меня кость вообще не дизайнерская, что я могу вообще не понимать в красоте. Так что панамка уже наготове, кидайте полагающееся - я поймаю. Натянем эту плоскую карту на сферу:
Вроде бы, выглядит нормально. Ничто и никто друг на друга не налезает. А потому можно продолжать дальше. И теперь сотворим мы горы.
Опять же, в реальной жизни горы - штука сложная. Ну, литосферные плиты там, движение этих плит, вулканическая активность. Хорошо, что у меня все было описано в заявке: из плоти дракона получилась почва, а из костей - горы. Что нам это дает? А дает нам это расположение основных горных хребтов - раскидаем их по позвоночнику, по крыльям. В общем, где там у дракона должны быть кости? Кажется, как-то так:
А теперь пришла пора сотворить воду. Не, я вижу, что океан есть и так, но реки-то добавить нужно. А что для добавления рек нужно знать? А вот что: а) вода течет, а не текет; б) однако если рек много, то они текут, а не течут; в) река течет оттуда, где повыше, туда, где пониже; г) реки не разделяются (я знаю про бифуркацию рек, но это реально единичные примеры на долбанные тысячи рек), равно как и из озер может вытекать ровно одна река - вода всегда найдет путь наименьшего сопротивления. А еще добавим озер. Но будем помнить, что у нас мир сделан из огромного разложившегося трупа дракона, у нас нет тектонической активности, так что никаких нам Байкалов - только озера, подпитываемые ледниками.
А чтобы карта пустой не казалось, добавим украшательств - я про деревья. Вообще следует понимать, что без деятельности человека леса будут везде. Вот прям почти везде. Но не закрашивать же всю карту деревьями. Я ограничился парочкой мест. В итоге получим вот что:
Что нам дают реки? Очень важную информацию, между прочим, - мы теперь знаем, где будет плодородно и зелено, где пустынно и сухо (как на Арракисе, а вот шутить про бывшую я не буду, но вы ни в чем себе не отказывайте). А еще вода - это основа жизнедеятельности человека. Реки, заливы - все это намекает, где я буду расставлять города, как я буду проводить границы стран.
Но вот об этом я буду рассказывать в следующем посте. Просто потому, что у меня еще есть целая неделя до следующей игры.