# Персонажи «Очага» — Scenario, 19 сентября 2026

Мужской и женский персонажи в стиле LEGO созданы заново по сгенерированным
концептам. Геометрия прежней LDraw-минифигурки не использовалась в генерации.
Обе модели подключены к игре и просмотру `characters.html`. Выбор:
`?character=male` / `?character=female`; в прогулке добавляется `view=design`.

Для каждого персонажа:

- `*-concept.png` — исходный концепт, встроенный imagegen OpenAI.
- `*-prompt.txt` — полный текст запроса концепта.
- `male.glb`, `female.glb` — результат Scenario Tripo 3.1, текстура встроена.
- `*-rigged.glb` — результат Tripo Rigging 1.0, 41 кость без клипов.
- `*-idle.glb` — исходный экспорт с клипом `preset:biped:idle`, для скачивания.
- `*-runtime.glb` — CSP-совместимый экспорт: квантованные потоки и WebP 1024²,
  качество 90, без runtime Meshopt/WASM. Мужской: 822 456 байт; женский: 904 676.
  Геометрия/скелет/текстура точно совпадают с декодированным HQ, дополнительная
  погрешность — 0. Итоговые SHA-256 — `csp-runtime.json`.
  `optimization.json` описывает промежуточный Meshopt HQ, не конечные runtime GLB.

`provenance.json` содержит модели генераторов, параметры, seed, идентификаторы
заданий/ассетов и SHA-256 файлов со скелетами. Секретов и подписанных URL нет.
Расход Scenario: 60 CU на каждую геометрию + 70 CU на каждый скелет с idle,
всего 260 CU. Первый отклонённый концепт обычной игрушки в 3D не запускался.

Фактическая геометрия: 11 845 треугольников у путешественника, 14 918 у
путешественницы. Запрошенный `faceLimit: 10000` не является точным числом
выходных треугольников. Исходные GLB не требуют внешних текстур или декодеров.
Для runtime нужны KHR_mesh_quantization и EXT_texture_webp, без Meshopt.
GLB встроен в ленивый JS-модуль; atob и TextureLoader читают его и data URI
текстуры без fetch. Модель не вызывает WASM, workers, сервис генерации или CDN.
Meshopt используется только в offline-подготовке; лицензия:
`../MESHOPT-LICENSE.txt` (MIT, Arseny Kapoulkine).

В игре и галерее используется прежняя процедурная анимация «Очага»:
ходьба, покой, сбор, удар, высекание огня. Автоматический idle не проигрывается
поверх неё. Плечи, бёдра, голова и кисти управляются через исходную bind-позу.
Кости локтей/коленей сохраняют относительную позу; исходные смешанные веса
на границах деталей сохраняют цельную поверхность. Не разрезать треугольники
по преобладающей кости — это разрывает шею и плечи.

Крепления измерены отдельно в координатах каждой кисти. Рукояти сужены до
размера отверстий, меч развёрнут вокруг штифта кисти. Напечатанные глаза
не мигают; рюкзак не имеет прежнего отдельного вторичного покачивания.
SkinnedMesh нельзя объединять через `batchModel` или сбрасывать через
`skeleton.pose()` без учёта внешнего поворота импортированной сцены.
