Целью работы является создание воксельного трехмерного движка с возможностью генерации бесконечного ландшафта, а также его изменения сохранения. Поддерживается изменение мира несколькими людьми. Используется клиент-серверная архитектура. Для визуализации используется собственный движок освещения, работающий в реальном времени. Для рендеринга используется библиотека OpenGL.
Отличительной особенностью является высокое быстродействие, а также большая дальность прорисовки.
Приложение написано на C++ и не использует высокоуровневых библиотек, что обеспечивает лёгкое портирование. Используются лишь следующие библиотеки: OpenGL, libpng, zlib, freetype. Платформно-зависимый код используется лишь для поддержки оконной системы, сокетов, многопоточности, файловой системы и отладки. На данный момент поддерживаются операционные системы Windows и Linux, а также ведётся тестирование версий под Android и OS X.
Клиент состоит из нескольких компонентов:
- Загрузчик и генератор карты
- Движок освещения
- Генератор мешей
- Пользовательский интерфейс
- Физический движок
- Графический движок
Сервер отвечает за синхронизацию физики, времени, изменения ландшафта, а также за обмен сообщениями между клиентами.
За координацию работы других компонентов клиента отвечает загрузчик карты. Он работает в три потока, образующих конвейер. Первый поток получает у сервера нужные сжатые подмиры (части карты фиксированного размера), загружает с диска или вызывает генератор. Затем данные передаются передаются во второй поток для освещения, после чего третий поток строит меши с учётом освещения и передаёт их в поток визуализатора для отправки на видеокарту.
Движок освещения просчитывает свет от солнца (или луны) и других источников освещения (от лампы). Движок позволяет в реальном времени пересчитывать освещение в случае изменения ландшафта.
Мир хранится в отдельных файлах, называемых чанками, содержащих сжатые данные подмиров. Данные хранятся и у клиента, и у сервера. Благодаря этому клиент не получает подмир, если он не изменился с момента последнего посещения.
Для генерации ландшафта используется шум Перлина. Благодаря этому достигается разнообразие мира. Карта условно делится на различные природные зоны: от заснеженных гор до песчаных пляжей.
Приложение поддерживает локализацию на различные языки с помощью специальных файлов локализации. В данный момент реализована поддержка русского и английского.
Также имеется возможность импорта карты из Minecraft. Для этого используется специальный конвертор.
В настоящий момент разработан быстрый мультиплатформенный симулятор мира, отличающийся от других высокой производительностью. В текущий момент ведётся работа по оптимизации движка освещения и его улучшению, а также генерации более разнообразного ландшафта (с пещерами и деревьями).
Материалы проекта
Исходный код
Репозиторий проекта
|