05NVC Maps

Приложение 2. Диаграммы

flowchart TB
  subgraph L1[Автор уровня]
    direction LR
    S(( )) --> A1[Снять место в сканере]
    A1 --> A2[Выгрузить плотную модель]
  end
  subgraph L2[3D-художник]
    direction LR
    B1[Почистить и упростить модель] --> B2[Построить опору для персонажа]
    B2 --> B3[Выставить размеры]
  end
  subgraph L3[Разработчик игры]
    direction LR
    C1[Импортировать в движок] --> C2{Персонаж проходит уровень?}
    C2 -- Да --> E((( )))
  end
  A2 --> B1
  B3 --> C1
  C2 -- Нет: брак съёмки --> A1
  C2 -- Нет: брак опоры --> B2
  classDef manual fill:#fde2e1,stroke:#d9534f,color:#111;
  classDef node0 fill:#111,stroke:#111;
  class B1,B2,B3,C2 manual
  class S,E node0

Рис. П.2.1. Процесс AS-IS: уровень с реального места сегодня

UML-диаграмма активности с дорожками по ролям. Ручные шаги и поздняя проверка отмечены красным. Все три роли может выполнять один человек.

flowchart TB
  subgraph L1[Оператор съёмки]
    direction LR
    S(( )) --> A1[Обойти зону 10–30 секунд]
    A3[Отправить съёмку]
  end
  subgraph L2[Система NVC Maps]
    direction LR
    B1[Проверить запись на телефоне] --> B2{Запись годится?}
    B2 -- Нет --> B3[Показать причину и «Переснять»]
    B4[Собрать карту на сервере] --> B5{Условия табл. 2.10 выполнены?}
    B5 -- Нет --> B6[Отказ с причиной]
    B5 -- Да --> B7[Пакет и отчёт готовы]
  end
  subgraph L3[Сборщик карты и разработчик игры]
    direction LR
    C1[Пройти по карте в браузере] --> C2{Персонаж проходит?}
    C2 -- Да --> C3[Скачать пакет в движок]
    C3 --> E((( )))
  end
  A1 --> B1
  B2 -- Да --> A3
  A3 --> B4
  B3 --> A1
  B6 --> A1
  B7 --> C1
  C2 -- Нет --> A1
  classDef node0 fill:#111,stroke:#111;
  class S,E node0

Рис. П.2.2. Процесс TO-BE: уровень с NVC Maps

UML-диаграмма активности с дорожками по ролям. Ручных шагов доводки нет; брак отсекается проверкой записи и отказом сборки.

flowchart LR
  Op([Оператор съёмки])
  Col([Сборщик карты])
  Dev([Разработчик игры])
  Team([Команда сервиса])
  subgraph NVC[Система NVC Maps]
    App[Приложение съёмки]
    API[Сервис приёма и заданий]
    Worker[Конвейер сборки]
    Web[Веб-клиент]
  end
  ARKit[[ARKit и LiDAR на iPhone]]
  Host[[Хостинг: база и хранилище файлов]]
  Engine[[Игровые движки: Godot, Unity, Unreal]]
  Op --> App
  App <--> ARKit
  App -->|съёмка| API
  Col --> Web
  Web -->|статус, отчёт, карта| API
  API --> Worker
  API <--> Host
  Worker <--> Host
  Dev -->|скачивает пакет| Web
  Dev --> Engine
  Team -->|тестовая ссылка| API

Рис. П.2.3. Контекстная диаграмма

flowchart LR
  Op([Оператор съёмки])
  Col([Сборщик карты])
  Dev([Разработчик игры])
  Team([Команда сервиса])
  Op --> U1(Записать зону)
  Op --> U2(Проверить запись)
  Op --> U3(Отправить съёмку)
  Col --> U4(Загрузить съёмку из браузера)
  Col --> U5(Открыть свои задания)
  Col --> U6(Смотреть отчёт)
  Col --> U7(Пройти по карте)
  Dev --> U8(Скачать пакет)
  Team --> U9(Выпустить или заменить тестовую ссылку)

Рис. П.2.4. Диаграмма вариантов использования

%%{init: {"themeVariables": {"fontSize": "20px"}, "sequence": {"messageMargin": 22, "boxMargin": 6, "actorMargin": 40, "messageFontSize": 20, "actorFontSize": 20, "noteFontSize": 18, "mirrorActors": false}}}%%
sequenceDiagram
  actor Op as Оператор съёмки
  participant App as Приложение съёмки
  participant API as Сервис приёма
  participant W as Конвейер сборки
  Op->>App: Записать зону и остановить
  App->>App: Проверить запись
  alt Запись не годится
    App-->>Op: Причина и «Переснять»
  else Запись годится
    Op->>App: Отправить
    App->>API: Съёмка и ключ пользователя
    alt Обрыв связи
      App-->>Op: Ошибка сети, отправку можно повторить
      Op->>App: Отправить ещё раз
      App->>API: Та же съёмка
      API-->>App: Прежнее задание, вторая сборка не стартует
    else Связь есть
      API-->>App: Задание «в очереди»
    end
    API->>W: Задание
    W->>API: Статус «готово» или «отказ» с причиной
  end

Рис. П.2.5. Системная диаграмма последовательности UC-1 «Снять и отправить участок»

%%{init: {"themeVariables": {"fontSize": "20px"}, "sequence": {"messageMargin": 22, "boxMargin": 6, "actorMargin": 40, "messageFontSize": 20, "actorFontSize": 20, "noteFontSize": 18, "mirrorActors": false}}}%%
sequenceDiagram
  actor Col as Сборщик карты
  participant App as Приложение съёмки
  participant Web as Веб-клиент
  participant API as Сервис приёма
  participant S as Хранилище
  Col->>App: Открыть в браузере
  App->>API: Запрос одноразовой ссылки
  API-->>App: Ссылка на 10 минут
  App->>Web: Открыть ссылку
  Web->>API: Обменять ссылку на сессию
  alt Ссылка уже открыта или истекла
    API-->>Web: «Ссылка уже открыта или истекла»
    Web-->>Col: Пустой вход, нужна новая ссылка с телефона
  else Ссылка действует
    API-->>Web: Список заданий пользователя
    Col->>Web: Открыть задание
    alt Сборка завершилась отказом
      API-->>Web: Статус «отказ» и причина
      Web-->>Col: Причина, просмотр и скачивание недоступны
    else Сборка готова
      Web->>S: Опора и кадр съёмки по короткой ссылке
      Col->>Web: Пройти по карте и скачать пакет
    end
  end

Рис. П.2.6. Системная диаграмма последовательности UC-2 «Проверить карту в браузере»

flowchart TD
  S(( )) --> A[Открыть «Сканировать»]
  A --> B[Рамка зоны 0,8 × 0,8 м]
  B --> C[Обход 10–30 секунд, стоп]
  C --> D{"Проверка: 10–30 с, путь ≥ 0,28 м, ракурс ≥ 90°, зона ≤ 0,92 м, разрыв поз ≤ 0,5 с"}
  D -- Не пройдена --> E[Причина и «Переснять»]
  E --> A
  D -- Пройдена --> F[Отправить]
  F --> G{Связь есть?}
  G -- Обрыв --> H[Отправить ещё раз]
  H --> I{Съёмка уже на сервере?}
  I -- Да --> J[Вернуть прежнее задание]
  I -- Нет --> K[Создать задание]
  G -- Да --> K
  J --> Q[Задание в очереди]
  K --> Q
  Q --> Z((( )))
  classDef node0 fill:#111,stroke:#111;
  class S,Z node0

Рис. П.2.7. Диаграмма активности UC-1 с альтернативными потоками