Простой 3D-редактор Simple3DEditor
Введение
Simple3DEditor — это базовый 3D-редактор, написанный на C++. Графика основана на OpenGL. Возможно, со временем функционал редактора расширится.
В этом репозитории представлена версия для мультимедийного расширения. В настоящее время поддерживается только эта ветка, хотя размер скомпилированной основной программы составляет примерно 1 МБ.
Библиотеки
- OpenGL;
- OpenAL;
- stb_image;
- SoundTouch;
- FFmpeg.
Функции редактора
- Базовое моделирование.
- Базовая графика.
- Редактирование UV-координат и наложение текстур.
- Декодирование аудио.
- Вокодер.
- Объёмный звук.
- Печать рендеринга.
- Создание анимации.
Планируемые функции
- Материалы.
- Кодирование вывода аудио.
- Видеокодирование и декодирование.
- Редактор шейдеров.
- Рендеринг 3D звука, анимации и видео с последующим кодированием вывода.
- Редактор узлов кода управления.
- Редактор графических узлов.
- Кисть 3D.
- Акварельная кисть.
- Трассировка лучей при рендеринге.
- Система плагинов. Планируется регистрация окон, меню, объектов, функций анимации, модификаторов, операций над объектами, инструментов ввода-вывода файлов и даже компилятора игр.
- Встроенный небольшой MC-игровой клиент (шутка).
Для удобства компиляции все зависимости (кроме базовых библиотек C++ и операционной системы) были добавлены в этот репозиторий. Это должно облегчить поиск зависимостей во время компиляции.
Этот проект — дань памяти трём годам обучения в старшей школе и участия в олимпиадах по информатике. Автор считает, что было бы неправильно не создать какое-нибудь программное обеспечение за это время. Скорее всего, редактор будет поддерживаться до окончания университета и после него.
Архитектура программного обеспечения
Редактор
Основные окна:
- MainWindow — главное окно;
- PaintWindow — окно рисования;
- UVEditWindow — редактор UV-координат;
- TreeWindow — окно управления объектами в виде дерева;
- AudioPlayerWindow — проигрыватель аудио;
- AudioCaptureWindow — запись и обработка звука;
- AnimationWindow — управление анимацией;
- RenderWindow — окно рендеринга;
- NodeMapWindow — редактор узлов (не завершён).
GUI-контейнеры, менеджеры и компоненты:
- AnimationCurve — кривая анимации;
- Container — контейнер;
- Menu — меню;
- UIManager — менеджер пользовательского интерфейса;
- ViewManager — менеджер окон просмотра.
Внешние диалоговые окна:
- ColorBoard — палитра цветов;
- Tips — информационные сообщения.
Библиотека инструментов
Часть функционала зависит от платформы. Исходный код находится в каталоге platform.
Базовые инструменты:
- String — строки (зависит от платформы);
- List — изменяемый массив;
- File — файл (зависит от платформы);
- Queue — очередь;
- StringBuilder — класс для построения строк;
- AudioUtils — инструменты для работы с аудио;
- DataBuffer — буфер данных.
Графическая библиотека (можно реализовать другие графические API или даже мягкий растр):
- GLUtils — графические инструменты;
- GLSimplified — упрощённые функции OpenGL;
- GLTexture2D — 2D текстуры;
- GLLights — управление освещением;
- GLShader — шейдеры;
- GLProgram — программы шейдеров;
- GLRenderTexture2D — рендеринг 2D текстур;
- GLVertexArray — массивы вершин;
- GLVertexBuffer — буферы вершин;
- GLIndexBuffer — индексные буферы;
- GLComputeProgram — вычислительные программы GPU.
Математическая библиотека:
- Math — основные математические функции;
- LinearAlgebra — линейная алгебра;
- Geometry — геометрические фигуры;
- Mesh — сетки;
- Property — свойства;
- ViewObject — видимые объекты.
Библиотека операционной системы (планируется реализация для разных платформ):
- AppFrame — основное окно приложения;
- Font — управление шрифтами;
- GLFunc — расширенные функции OpenGL;
- Log — вывод логов;
- Resource — управление ресурсами;
- Shell — вызов команд;
- Thread — управление потоками;
- Time — время.
Планируемые части:
- GUIManager — управление 2D-объектами. Должен заменить UIManager и управлять координатами преобразования. Возможно также использование AViewObject и создание CanvasObject.
- PluginManager — менеджер плагинов. Уже реализована возможность сделать основную программу динамической библиотекой. Плагины должны взаимодействовать с функциями и классами основной программы. Также рассматривается вариант использования Java для взаимодействия с плагинами.
- WindowManager — менеджер окон. Для регистрации новых типов окон во время выполнения.
- test — папка для модульных тестов.
- Интеграция с Autodesk FBX SDK. Импорт и экспорт сцен и объектов в формате .fbx.
- Собственная система рендеринга или использование готовых решений.
- Вычислительный конвейер рендеринга и трассировка лучей. Реализация может быть сложной, а также непонятно, как получить доступ к OpenRL SDK.
- Не хватает многих компонентов пользовательского интерфейса. Предыдущий компонент UIEditA не соответствовал ожиданиям автора из-за недостатков UIManager. Сейчас планируется его переписать. По крайней мере, нужен редактор свойств.
- Интеграция json-cpp для сохранения настроек.
- Сделать так, чтобы все классы, которым нужно сохранять данные, наследовали интерфейс сериализации и реализовывали его. Реализовать сохранение состояния программы. Структура данных: магическое слово 'SVFILE', объектный идентификатор {данные, [объектный идентификатор, ...]}, дерево с одним корнем.
- После каждой команды реализовывать соответствующий IUndo и добавлять его в очередь LocalData для отмены действий. Много работы.
- Использовать FreeType для поддержки китайского языка и кроссплатформенности.
- Использовать GLFW для кроссплатформенных окон приложений. Для Windows можно оставить реализацию в платформе для некоторых функций, таких как обработка сообщений WM_DROPFILES.
- Заменить GLEW на GLEW для получения расширенных функций OpenGL. Ручная загрузка была вызвана проблемами с конфигурацией.
- Если возможно, интегрировать IDE для плагинов, чтобы упростить разработку плагинов. Может ли это стать похожим на Houdini?
- Если использовать Java в качестве языка плагинов, то можно добавить среду выполнения и объединить множество плагинов в одно приложение. Но не похоже ли это на то, как работает Unity3D на Android?
- ShaderConductor от Epic Games — открытый исходный код. Можно использовать для реализации кросс-API шейдеров.
- «Рендеринг» должен поддерживать 3D звук во время анимации. Нужно найти способ использовать OpenAL для вывода стереозвука и напрямую рендерить видео со звуком с помощью FFmpeg. Это одна из самых интересных функций для автора.
- При извлечении устройства во время воспроизведения звука через OpenAL невозможно воспроизвести звук снова. Необходимо написать обработчик событий для изменений оборудования и обновить все аудиоданные в этом обработчике. Все аудиоплееры могут быть реализованы как производные классы AViewObject. Во время события необходимо уведомить все звуковые источники о необходимости обновления. Обратите внимание, что аудиоданные сохраняются в звуковых объектах.
Автор предполагает, что на завершение проекта уйдёт несколько лет. Он планирует больше учиться и меньше писать код самостоятельно. Просит помощи у других разработчиков в реализации задуманного (считает, что это большой проект).
Скриншоты
Скриншот |
Описание |
capture1 |
|
capture2 |
|
capture3 |
|
capture4 |
|
Установка
- Скачать релиз или исходный код и скомпилировать.
- Убедиться, что установлен и настроен mingw (все зависимости находятся в ветке AVDevelop).
- Выполнить make.exe в папке с исходным кодом.
Использование
- Документация пока не написана, но можно посмотреть .rc файл для поиска быстрых клавиш.
- Возможны ошибки.
- На данный момент автор один, и если нужна новая функциональность, пожалуйста, поймите, сколько времени требуется на разработку.
Таблица быстрых клавиш
Обратите внимание: Ctrl+W открывает меню управления окнами.
Клавиша |
Действие |
p |
Добавить точку |
f |
Добавить линию или плоскость (выбрать две или три точки) |
g |
Перемещение |
r |
Вращение |
s |
Масштабирование |
c |
Выбор цвета (сначала выбрать вершину) |
x |
Операция на оси X |
y |
Операция на оси Y |
z |
Операция на оси Z |
X (shift + x) |
Операция на плоскости XY |
Y (shift + y) |
Операция на плоскости ZX |
Z (shift + z) |
Операция на плоскости XZ |
delete |
Удалить вершину |
ESC |
Выход |
Ctrl+S |
Сохранить |
Alt+/ Alt+? |
Информация о программе |
Alt+(0-9) |
Выбор инструмента |
Ctrl+L |
Загрузить |
e |
Создать новую вершину |
Shift+A |
Основное меню |
Ctrl+P |
Печать |
Участие и вклад
- Fork этого репозитория.
- Создать ветку Feat_xxx.
- Отправить код.
- Создать Pull Request.
Специальные навыки
- Использование Readme_XXX.md для поддержки разных языков, например Readme_en.md, Readme_zh.md.
- Официальный блог Gitee [blog.gitee.com].
- Можно https://gitee.com/explore для изучения отличных проектов с открытым исходным кодом на Gitee.
- ...
Опубликовать ( 0 )