README.md

MiodenusAnimationConverter

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).

Особенности установки на Windows

В директорию проекта (где находятся файлы с расширением .dll) необходимо поместить файл ffmpeg.exe.

Особенности установки на Linux

Приложение было протестировано под ОС Kubuntu 21.10.

Рекомендуется использовать проприетарные драйвера для видеокарты.

Установка .NET 5 в Kubuntu.

Установка зависимостей:

sudo apt install -y libgdiplus

sudo apt install ffmpeg

Описание

[RU] Консольное приложение, отвечающее за преобразование входных данных в итоговый видеофайл, содержащий анимацию сборки. [EN] This console application converts input data into a video file containing an animation of the assembly.

Конвейеры
0 успешных
0 с ошибкой