MiodenusAnimationConverter - это консольное приложение, входящее в состав Miodenus Project, отвечающее за преобразование входных данных (см. ниже) в итоговый видеофайл, содержащий анимацию сборки (как вариант).
Ниже представлена демонстрационная сборка редуктора привода лебёдки, созданная в MiodenusAnimationConverter.
На вход данное приложение принимает файл, описывающий анимацию сборки (его структура представлена ниже). В самом файле указываются пути до файлов используемых 3D-моделей.
В MiodenusAnimationConverter параметры анимации описываются собственным протоколом MAF (MiodenusAnimationFile). Расширение файлов данного протокола принято устанавливать как .maf
.
Согласно протоколу MAF, файл, описывающий анимацию, должен состоять из следующих блоков:
animationInfo
- описание общих параметров анимацииmodelsInfo
- перечень используемых 3D-моделей и параметры их загрузкиactions
- перечень обобщённых действий над моделямиbindings
- перечень привязок обобщённых действий к конкретным моделям
Ниже представлен пример содержимого анимационного файла.
{
"animationInfo":
{
"type": "maf",
"version": "1.0",
"name": "Demo assembling",
"videoFormat": "mp4",
"videoCodec": "mpeg4",
"videoBitrate": 4000,
"videoName": "ResultVideo",
"timeLength": 0,
"fps": 60,
"enableMultisampling": true,
"frameWidth": 800,
"frameHeight": 800,
"backgroundColor": [0.3, 0.3, 0.4],
"include": [ "Demo/Includes/header.maf" ]
},
"modelsInfo":
[
{
"name": "00_000_06_13_13_01",
"type": "stl",
"filename": "Demo/Models/00_000_06_13_13_01.stl",
"color": [0.45, 0.52, 0.58],
"useCalculatedNormals": false
},
{
"name": "00_000_06_13_13_02",
"type": "stl",
"filename": "Demo/Models/00_000_06_13_13_02.stl",
"color": [0.45, 0.52, 0.58],
"useCalculatedNormals": false
},
{ "name": "00_000_06_13_13_03", "filename": "Demo/Models/00_000_06_13_13_03.stl" },
{ "name": "00_000_06_13_13_04", "filename": "Demo/Models/00_000_06_13_13_04.stl" },
{ "name": "00_000_06_13_13_05", "filename": "Demo/Models/00_000_06_13_13_05.stl" },
{ "name": "00_000_06_13_13_06", "filename": "Demo/Models/00_000_06_13_13_06.stl" },
{ "name": "00_000_06_13_13_07", "filename": "Demo/Models/00_000_06_13_13_07.stl" },
{ "name": "00_000_06_13_13_08", "filename": "Demo/Models/00_000_06_13_13_08.stl" },
{ "name": "00_000_06_13_13_09", "filename": "Demo/Models/00_000_06_13_13_09.stl" },
{ "name": "00_000_06_13_13_10", "filename": "Demo/Models/00_000_06_13_13_10.stl" },
{ "name": "00_000_06_13_13_11_1", "filename": "Demo/Models/00_000_06_13_13_11.stl" },
{ "name": "00_000_06_13_13_11_2", "filename": "Demo/Models/00_000_06_13_13_11.stl" },
{ "name": "00_000_06_13_13_12", "filename": "Demo/Models/00_000_06_13_13_12.stl" },
{ "name": "00_000_06_13_13_13", "filename": "Demo/Models/00_000_06_13_13_13.stl" },
{ "name": "00_000_06_13_13_14", "filename": "Demo/Models/00_000_06_13_13_14.stl" },
{ "name": "00_000_06_13_13_16", "filename": "Demo/Models/00_000_06_13_13_16.stl", "color": [0.15, 0.15, 0.15] },
{ "name": "00_000_06_13_13_19", "filename": "Demo/Models/00_000_06_13_13_19.stl" }
],
"bindings":
[
{
"modelName": "00_000_06_13_13_01",
"actionName": "Init 01",
"startTime": 0,
"timeLength": 0,
"useInterpolation": false
},
{
"modelName": "00_000_06_13_13_02",
"actionName": "Init 02",
"startTime": 0,
"timeLength": 0,
"useInterpolation": false
},
{ "modelName": "00_000_06_13_13_03", "actionName": "Init 03", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_04", "actionName": "Init 04", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_05", "actionName": "Init 05", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_06", "actionName": "Init 06", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_07", "actionName": "Init 07", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_08", "actionName": "Init 08", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_09", "actionName": "Init 09", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_10", "actionName": "Init 10", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_11_1", "actionName": "Init 11-1", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_11_2", "actionName": "Init 11-2", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_12", "actionName": "Init 12", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_13", "actionName": "Init 13", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_14", "actionName": "Init 14", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_16", "actionName": "Init 16", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_19", "actionName": "Init 19", "useInterpolation": false },
{ "modelName": "00_000_06_13_13_01", "actionName": "Переместить 01 в центр", "startTime": 1000 },
{ "modelName": "00_000_06_13_13_05", "actionName": "Переместить 05 в центр", "startTime": 1500 },
{ "modelName": "00_000_06_13_13_19", "actionName": "Соединить 19 и 05", "startTime": 2500 },
{ "modelName": "00_000_06_13_13_07", "actionName": "Соединить 07 и 05", "startTime": 3500 },
{ "modelName": "00_000_06_13_13_16", "actionName": "Соединить 16 и 05", "startTime": 4500 },
{ "modelName": "00_000_06_13_13_04", "actionName": "Переместить 04 в центр", "startTime": 5500 },
{ "modelName": "00_000_06_13_13_03", "actionName": "Соединить 04 и 03", "startTime": 6500 },
{ "modelName": "00_000_06_13_13_03", "actionName": "Соединить 04 + 03 и 05", "startTime": 9000 },
{ "modelName": "00_000_06_13_13_04", "actionName": "Соединить 04 + 03 и 05", "startTime": 9000 },
{ "modelName": "00_000_06_13_13_10", "actionName": "Переместить 10 к сборке", "startTime": 10000 },
{ "modelName": "00_000_06_13_13_09", "actionName": "Соединить 09 и 10", "startTime": 10500 },
{ "modelName": "00_000_06_13_13_13", "actionName": "Соединить 13 и 10", "startTime": 11000 },
{ "modelName": "00_000_06_13_13_14", "actionName": "Соединить 14 и 10", "startTime": 12000 },
{ "modelName": "00_000_06_13_13_10", "actionName": "Соединить 10 + 09 + 13 + 14 и 01", "startTime": 14500 },
{ "modelName": "00_000_06_13_13_09", "actionName": "Соединить 10 + 09 + 13 + 14 и 01", "startTime": 14500 },
{ "modelName": "00_000_06_13_13_13", "actionName": "Соединить 10 + 09 + 13 + 14 и 01", "startTime": 14500 },
{ "modelName": "00_000_06_13_13_14", "actionName": "Соединить 10 + 09 + 13 + 14 и 01", "startTime": 14500 },
{ "modelName": "00_000_06_13_13_06", "actionName": "Соединить 06 и 10", "startTime": 15500 },
{ "modelName": "00_000_06_13_13_11_1", "actionName": "Соединить 11 и 10", "startTime": 16500 },
{ "modelName": "00_000_06_13_13_11_2", "actionName": "Соединить 11 и 10", "startTime": 16500 },
{ "modelName": "00_000_06_13_13_12", "actionName": "Соединить 12 и два 11", "startTime": 18500 },
{ "modelName": "00_000_06_13_13_02", "actionName": "Переместить 02 в центр", "startTime": 22000 },
{ "modelName": "00_000_06_13_13_08", "actionName": "Соединить 08 и 02", "startTime": 23000 },
{ "modelName": "00_000_06_13_13_02", "actionName": "Поднять 08 и 02", "startTime": 26000 },
{ "modelName": "00_000_06_13_13_08", "actionName": "Поднять 08 и 02", "startTime": 26000 },
{ "modelName": "00_000_06_13_13_02", "actionName": "Скрыть нижнюю крышку", "startTime": 27500, "useInterpolation": false },
{ "modelName": "00_000_06_13_13_08", "actionName": "Скрыть нижнюю крышку", "startTime": 27500, "useInterpolation": false },
{ "modelName": "00_000_06_13_13_04", "actionName": "Вращать 04", "startTime": 29000 },
{ "modelName": "00_000_06_13_13_05", "actionName": "Вращать 04", "startTime": 29000 },
{ "modelName": "00_000_06_13_13_03", "actionName": "Вращать 04", "startTime": 29000 },
{ "modelName": "00_000_06_13_13_06", "actionName": "Вращать 06", "startTime": 29000 },
{ "modelName": "00_000_06_13_13_10", "actionName": "Вращать 06", "startTime": 29000 },
{ "modelName": "00_000_06_13_13_11_1", "actionName": "Вращать 06", "startTime": 29000 },
{ "modelName": "00_000_06_13_13_11_2", "actionName": "Вращать 06", "startTime": 29000 }
]
}
Содержимое блока actions
было разбито на отдельные файлы. Ниже представлен пример содержимого одного из этих файлов.
{
"actions":
[
{
"name": "Вращать 04",
"states":
[
{
"time": 0,
"isModelVisible": true,
"color": [0.45, 0.52, 0.58],
"transformation":
{
"resetScale": false,
"scale": [1.0, 1.0, 1.0],
"resetLocalRotation": false,
"localRotate":
{
"angle": -180.0,
"unit": "deg",
"vector": [0.0, 1.0, 0.0]
},
"resetPosition": false,
"globalMove": [0.0, 0.0, 0.0],
"localMove": [0.0, 0.0, 0.0],
"rotate":
{
"angle": 0.0,
"unit": "deg",
"rotationVectorStartPoint": [1.0, 0.0, 0.0],
"rotationVectorEndPoint": [1.0, 0.0, 0.0]
}
}
},
{
"time": 3000,
"transformation": { "localRotate": { "angle": -180.0, "vector": [0.0, 1.0, 0.0] } }
}
]
}
]
}
В результате работы приложения будет получен видеофайл, содержащий анимацию сборки (как вариант). В случае передачи особых аргументов результат работы приложения может быть другим (см. ниже).
Обязательный аргумент | Ключ | Значение | Примечание |
---|---|---|---|
Да | -a --animation |
Путь до файла, описывающего анимацию сборки | Путь лучше заключать в двойные " кавычки. |
Нет | -q --quiet |
Отсутствует | В данном режиме приложение не будет выводить сообщения (предупреждения, ошибки...) в консоль. Вывод информации в журнал не будет остановлен. |
Нет | -v --view |
Номер кадра, который будет загружен для просмотра * |
Будет запущено графическое окно (размер и другие параметры берутся из файла, описывающего анимацию сборки) в котором будет преставлено состояние анимации (сцена, положение камер...) на момент указанного кадра. При помощи определенных комбинаций клавиш (см. ниже) пользователь сможет осмотреть сцену. Если значение аргумента равно 0 — будет показана вся анимация. В данном режиме приложение не будет производить запись анимации. Диапазон допустимых значений: от 0 до числа кадров в итоговом видеофайле . |
Нет | -f --frame |
Номер кадра, который требуется получить в виде файла изображения * |
В папке screenshots появится файл изображения указанного кадра. Наименование файла будет иметь следующий вид: <номер-кадра>_<дата>.png , где <дата> имеет формат ГГГГ_ММ_ДД_чч_мм_сс . В случае если файл с таким именем уже существует — он будет перезаписан. В данном режиме приложение не будет производить запись анимации. Диапазон допустимых значений: от 1 до числа кадров в итоговом видеофайле . |
Нет | --help |
Отсутствует | В консоль будет выведена подробная справка о работе программы, после чего приложение завершит свою работу. |
Нет | --version |
Отсутствует | В консоль будет выведена информация о версии установленной программы, после чего приложение завершит свою работу. |
*
— Аргументы --view
и --frame
не могут применяться одновременно!
Команда, представленная ниже, создаст итоговый видеофайл сборки, используя анимационный файл animation.maf. Приложение не будет выводить какие-либо сообщения в консоль.
$ ./MiodenusAnimationConverter --animation "path/to/animation.maf" --quiet
Управление взглядом камеры осуществляется при помощи мыши. Скорость передвижения камеры управляется колесом прокрутки (при зажатии клавиши LeftAlt
будет изменяться значение FOV).
В данном режиме работы приложение "захватывает" курсор. Для отображения курсора необходимо зажать клавишу LeftControl
.
Клавиша | Действие |
---|---|
Esc |
Завершение работы приложения. |
P |
Остановить / возобновить проигрывание анимации. |
N |
Отобразить / скрыть нормали. |
V |
Отобразить / скрыть камеры. |
F1 |
Установить режим отрисовки: полигоны. |
F2 |
Установить режим отрисовки: линии. |
F3 |
Установить режим отрисовки: вершины. |
G |
Отобразить / скрыть координатную сетку. |
L |
Переключить используемую камерой систему координат (локальная / мировая). |
W |
Движение камеры вперёд. |
A |
Движение камеры влево. |
S |
Движение камеры назад. |
D |
Движение камеры вправо. |
Space |
Движение камеры вверх. |
LeftShift |
Движение камеры вниз. |
Q |
Поворот камеры влево вокруг направления взгляда (зависит от СК). |
E |
Поворот камеры вправо вокруг направления взгляда (зависит от СК). |
Z |
Направить взгляд камеры в точку отсчёта мировой СК. |
I |
Переместить камеру в положение при загрузке. |
C + R |
Установить все параметры камеры (кроме положения) в значения по умолчанию. |
Можно воспользоваться уже скомпилированными исходниками (Windows 10 / Kubuntu 21.10).
Так же можно воспользоваться MiodenusUI для работы над файлом анимации постредством графического интерфейса (GUI).
В директорию проекта (где находятся файлы с расширением .dll) необходимо поместить файл ffmpeg.exe.
Приложение было протестировано под ОС Kubuntu 21.10.
Рекомендуется использовать проприетарные драйвера для видеокарты.
Установка .NET 5 в Kubuntu.
Установка зависимостей:
sudo apt install -y libgdiplus
sudo apt install ffmpeg