Разработчики регулярно развлекаются тем, что запускают на разных устройствах игру Doom. У нас есть статьи о том, почему они это делают и какие необычные устройства выбирают. Недавно разработчик Джеймс Браун запустил Doom на воксельном проекторе — он создаёт не плоское изображение, а трёхмерную картинку. Нам стало интересно, как устроен такой проектор и чем воксельный Doom отличается от обычного. Об этом сегодня и поговорим.
Вот как это выглядит в жизни, если что:
Пиксели, полигоны и воксели
Перед тем как говорить про воксели, вспомним, как устроена обычная 2D- и 3D-графика (которая тоже плоская и на экране монитора).
В 2D-графике изображения собираются из условных квадратов-пикселей. Условных потому, что пиксели по форме могут быть прямоугольными, квадратными или любыми другими. Но при большой плотности это неважно: чем больше пикселей, тем труднее их разглядеть и тем выше качество картинки. На современных топовых телефонах, например, плотность пикселей такая высокая, что глаз уже не может увидеть, где заканчивается один пиксель и начинается другой.
Качество выражается в разрешении, которое измеряется количеством пикселей по ширине и высоте изображения. Чем больше разрешение — тем качество картинки лучше. Вот для сравнения одно и то же изображение, но с разным разрешением:
В 3D-графике свои базовые блоки — треугольные полигоны. Их выбрали из-за того, что они всегда плоские и видеокарте несложно рисовать много-много таких треугольников. Любую сложную форму можно легко разбить на треугольники, причём чем меньше размер треугольника — тем точнее мы повторим форму исходного объекта. С полигонами то же правило, что и с пикселями: чем больше полигонов, тем более реалистичным будет изображение.
❗️ Полигоны образуют только поверхности 3D-объектов, а внутри они пустые. Это похоже на бумажную модель, у которой есть только каркас и нет наполнения.
Чтобы было понятнее, посмотрите, как создаётся трёхмерное изображение большого камня: поверхность разбивается на тысячи треугольников, чтобы они смогли повторить сложную форму поверхности:
Воксели — это объёмные пиксели (volumetric pixels). По сути, воксели — это те же пиксели, которым просто добавили третье измерение, чтобы получился как бы реальный трёхмерный миниатюрный пиксель.
В отличие от треугольных полигонов, с помощью вокселей создают трёхмерные модели не из оболочек, а из большого количества кубов. Внутри такие модели не пустые, а заполнены: даже там, где мы не видим, в воксельной модели всё заполнено вокселями.
Воксели пришли к нам из медицины благодаря компьютерной томографии. Там рентгеновские лучи совершают оборот вокруг тела пациента на одной высоте и фиксируются цифровыми датчиками. После этого компьютер выстраивает снимок-срез этой части тела, а томограф перемещается выше или ниже и запускает новый оборот рентгеновских лучей. В итоге получается послойный снимок, который можно сложить в одну объёмную модель — и получить точную трёхмерную виртуальную копию нужного участка тела.
В каждом вокселе может храниться информация о его цвете, плотности или прозрачности. Воксельная модель создаётся в заранее определённом 3D-пространстве, которое делится на объёмную сетку, а каждый воксель занимает в этой сетке одну ячейку. Чем мельче сетка, тем качественнее получается изображение.
Один из самых известных примеров воксельной графики — игра Minecraft:
Почему все до сих пор не перешли на воксели
Чтобы картинка из вокселей была такого же качества, как из полигонов, нужно её составлять из множества мелких вокселей, чтобы глаз не различал отдельные воксели. Но чтобы сложить такую картинку, компьютеру нужно в каждом кадре пересчитывать положение каждого вокселя — причём не только снаружи, но и внутри.
Чем больше вокселей в кадре, тем выше нагрузка на процессор. Даже современные мощные видеокарты не справятся с таким объёмом информации. Гораздо проще отрисовать только видимые части из полигонов и усилить визуализацию шейдерами — это инструкции, которые определяют, как выглядят поверхности объектов. Шейдеры отвечают за цвет, тени, отражения и другие эффекты.
Когда компьютеры станут достаточно мощными и смогут переваривать большие объёмы вокселей, воксельную графику будет не отличить от полигональной. Но пока что воксельную графику применяют в основном для стилизации:
Как устроен воксельный проектор
Воксельный проектор — не какая-то конкретная технология, а общий принцип. Основная идея состоит в том, чтобы создать трёхмерное пространство, в котором можно разместить и контролировать каждый воксель для отображения объёмного изображения. Это можно сделать разными способами.
Джеймс Браун запустил Doom на вращающемся дисплее. Это работает так: если панель с прямоугольной сеткой светодиодов будет крутиться достаточно быстро, то при правильной настройке включение и выключение светодиодов будет создавать иллюзию компьютерных вокселей. В итоге получится объёмное трёхмерное воксельное изображение:
Для проектора Doom использовались такие компоненты:
- Две большие скреплённые вместе светодиодные панели, 128×64 светодиода, 256×128 миллиметров. Пример панелей с AliExpress.
- Контроллер Raspberry Pi, который управляет панелями, обрабатывает данные воксельного изображения на компьютере и передаёт их в реальном времени на проектор для синхронизации с вращением.
- HUB75, софт-интерфейс для управления панелями. Он необходим для правильного подключения светодиодов к Raspberry Pi и передачи данных в реальном времени. Код интерфейса можно посмотреть на Гитхабе.
- Мотор для вращения панелей, например такой.
- Дополнительные комплектующие для мотора: контроллер скорости, подшипник, приводной ремень и противовес для балансировки при вращении.
- Акриловый прозрачный купол для защиты самого проектора и от проектора: панели вращаются со скоростью 600 оборотов в минуту, поэтому на всякий случай их лучше изолировать от рук и отлетевших при поломке деталей.
Пошаговый процесс сборки этого воксельного дисплея выглядит примерно так:
Собрать воксельный проектор можно и по-другому — из OLED-дисплеев, которые используются в современных смартфонах, компьютерах и планшетах. Если установить несколько прозрачных OLED-дисплеев друг за другом, получится объёмное пространство, которое можно использовать для отображения воксельной графики:
В таком проекторе использовано:
- 10 прозрачных OLED-дисплеев;
- блок питания на 12 вольт;
- микроконтроллер Feather M4;
- адаптированная под проект печатная плата Tenex V1;
- протокол связи нескольких устройств SPI;
- сенсор MPU6050, который помогает отслеживать движение проектора и его ориентацию в пространстве;
- Arduino IDE — среда разработки для программирования девайсов и передачи вокселей с компьютера на проектор;
- специальные компоненты для конструкции, напечатанные на 3D-принтере.
Собрать такое вручную уже гораздо сложнее, чем вращающийся проектор, но если есть свободное время и желание — почему бы и нет :-)
Для отображения воксельной графики подходят не только обычные и органические светодиоды. Проектор можно построить с помощью различных технологий: лазеров, тумана, зеркал и других, даже ультразвука. Главное — понять принцип, что нам нужно просто размещать воксели в конкретных точках пространства и быстро высчитывать их новые координаты.
Чем отличается воксельный и обычный Doom
Для запуска Doom на воксельном проекторе использовали не классическую версию игры, а специальную — Voxel Doom, разработанную Дэниелом Патерсоном и Нэшем Мухандесом.
В обычном Doom всё построено на псевдо-2D: игра создаёт ощущение трёхмерной графики, но использует 2D-технологии. Например, все движущиеся модели — двухмерные спрайты, то есть набор плоских анимаций, которые переключаются в зависимости от точки зрения игрока. Если обойти модель любого из персонажей, видны резкие смены наборов спрайтов:
Ещё в обычном Doom есть только два измерения для камеры, поэтому можно смотреть вправо и влево, а вверх и вниз нельзя. Все предметы для инвентаря и расставленные по уровню модели всегда как бы смотрят прямо на нас: нельзя увидеть, как они выглядят сбоку или сзади, потому что это тоже плоские 2D-спрайты.
Для воксельной версии разработчики заново выстроили все объекты, а для движущихся персонажей создали движущийся 3D-каркас и «нарастили» на него воксели. Когда у всех точек в игре появились реальные физические координаты, их стало возможно передать микроконтроллеру и отправить на дисплей. Теперь модели в игре стали полностью трёхмерными:
Как проектор понимает, что показывать
Главная задача для показа картинки — наладить передачу данных между компьютером и микроконтроллером, который будет управлять отображением вокселей. Это можно сделать несколькими способами, например:
- Arduino — набор инструментов для работы с электроникой. В него входят бесплатная IDE и набор печатных плат, которые можно купить и использовать в проектах. В качестве языка программирования используются C и C++.
- API Blender Python. Blender — бесплатный 3D-редактор, на котором можно подготовить 3D-изображение в вокселях и отправить на микроконтроллер с помощью языка программирования Python.
- Протокол SPI — проводной стандарт для связи нескольких устройств и управления ими через одно главное. Например, можно управлять воксельным проектором через компьютер.
В разных проекторах воксели будут тоже немного разные.
Если используется проектор с прямоугольным пространством, как несколько OLED-дисплеев, то координаты вокселей будут в трёх осях: длине, ширине и высоте.
Для вращающегося проектора нужна другая система, потому что такой проектор — это цилиндр, в котором разные светодиоды на панели загораются на разных углах поворота:
Координаты вокселей в этом случае нужны полярные: угол поворота, радиус и высота, на которых находится нужный светодиод.
Человеческий глаз не успевает заметить движение на большой скорости, поэтому получается непрерывное движение, но на самом деле в каждом видимом кадре происходит много разных поворотов панели.
Где применяются воксельные дисплеи
Воксельные дисплеи уже применяются или могут применяться везде, где полезно 3D-моделирование с объёмным отображением:
- в технике для подробной визуализации сложных моделей;
- в медицине для трёхмерного отображения органов;
- в архитектуре и инженерии;
- при разработке новых технологий с участием Джарвиса и роборуки;
- для наглядной симуляции опытов в науке;
- в играх для моделирования и самого игрового процесса.
А в следующий раз разберём какой-нибудь софт для управления механизмами и посмотрим, как выглядят простые программы для управления такими устройствами.